Python 理解-从字典字段中列出一个列表

Python 理解-从字典字段中列出一个列表,python,python-2.7,set,Python,Python 2.7,Set,目前,我正在这样做: nodes = set([relation.source for relation in relations] + [relation.target for relation in relations]) 肯定有更简单的方法,但我找不到 差不多 nodes = set([(relation.source, relation.target) for relation in relations]) 但这当然行不通。 谢谢 [编辑] 忘了提一下: 关系

目前,我正在这样做:

nodes = set([relation.source for relation in relations] +
            [relation.target for relation in relations])
肯定有更简单的方法,但我找不到

差不多

nodes = set([(relation.source, relation.target) for relation in relations])
但这当然行不通。 谢谢

[编辑] 忘了提一下:
关系是一个字典,或者在我的例子中是一个对象的集合。

您可以在*-理解(列表、集合、dict、生成器表达式)中为子句使用多个

上述表达式类似于:

nodes = set()
for relation in relations:
    for x in [relation.source, relation.target]:
        nodes.add(x)
nodes

使用生成函数的备选方案:

def source_targets(relations):
    for relation in relations:
        yield relation.source
        yield relation.target

nodes = set(source_targets(relations))

您可以在*-理解(列表、集合、dict、生成器表达式)中为
子句使用多个

上述表达式类似于:

nodes = set()
for relation in relations:
    for x in [relation.source, relation.target]:
        nodes.add(x)
nodes

使用生成函数的备选方案:

def source_targets(relations):
    for relation in relations:
        yield relation.source
        yield relation.target

nodes = set(source_targets(relations))
您可以使用,这可能比集合理解更好一些:

from itertools import chain

nodes = set(chain.from_iterable((r.source, r.target) for r in relations))
您可以使用,这可能比集合理解更好一些:

from itertools import chain

nodes = set(chain.from_iterable((r.source, r.target) for r in relations))

是的,我想是这样。我相信更好的逻辑是将
切换为
ordering@MihaiZamfir,不,你不能切换。如果你改变顺序,它会变成不同的表达方式;对于此特定代码,它将引发错误。我更新了答案。检查会帮助你理解我的意思。是的,我想这是。我相信更好的逻辑是将
切换为
ordering@MihaiZamfir,不,你不能切换。如果你改变顺序,它会变成不同的表达方式;对于此特定代码,它将引发错误。我更新了答案。检查会帮助你理解我的意思。