我有一个由节点和边组成的有向图结构,它们都是Event父类的子类。根据外部事件,边可以是活动的或非活动的。然后我找到从给定节点到根节点的所有有向路径,但我真的只关心沿途的节点,而不是边缘。例如,要从一组边转换为一组节点,我使用:
>>> paths
[[<Edge F>, <Edge B>]]
>>> lst = [set(map(lambda e: e.tail, path)) for path in paths]
其中path是边列表。这让我感到困惑:当我去检查lst
的内容时,它会根据我访问它的方式而改变
>>> lst
[set([<Node 2>, <Node 1>])]
>>> [type(n) for n in path for path in lst]
[<class 'libs.network.Edge'>, <class 'libs.network.Edge'>]
>>> [type(n) for n in lst[0]]
[<class 'libs.network.Node'>, <class 'libs.network.Node'>]
为什么这两种访问类型信息的方式不一样?
答案 0 :(得分:3)
您的列表理解顺序错误。嵌套循环从从左到右列出。
所以表达式
[type(n) for n in path for path in lst]
以
执行for n in path:
for path in lst:
type(n)
所以n
来自之前预先分配的path
变量,而变量包含Edge
个实例。那些对象 nothing 与您在其他表达式中循环的lst[0]
内容有关。
你可能想要反过来这样做:
[type(n) for path in lst for n in path]
这样path
实际上是从lst
设置的之前迭代它。