2013-01-24 86 views
1

这应该是微不足道的。然而,我不觉得我的技巧是100%确定的。在Python中反向索引列表列表

我有一个列表(lol;)),捕获图形节点之间的边缘关系。假设我有一个指导的图,其中4个节点标记为0,1,2,3。边是{(0,2),(0,3),(1,0),(1,3),( 2,1)}等邻接LOL(称之为a)是

a = [[2,3],[0,3],[1],[]] 

我想找到发病笑了,即列出了指示哪些节点是入射在节点的列表。在这个例子中,发病率洛尔(称之为b)将是:

[[1], [2], [0], [0, 1]] 

我尝试下面的代码:

b = [[],[],[],[]] 
[b[j].append(i) for i,x in enumerate(a) for j in x] 

这给了我正确的关联矩阵b

第二步,尽管工作,理想情况下应该是b[j].append(i) for i,x in enumerate(a) for j in x,没有开放[和关闭]。但是Python解释器在没有它的情况下会发出语法错误。有没有更好的措辞措辞呢?

回答

2

你的问题基本上是关于使用列表解析副作用。如,例如the answers to this question说,将它分解为一个循环(或循环)正要走的路:

for i, x in enumerate(a): 
    for j in x: 
     b[j].append(i) 

而且,请注意,列表解析用于构建列出一个很自然的,简单的方法,像数学家是用来做的。这就是为什么在Python中,语法需要方括号(在你的情况下)。

+0

我基本上想避免循环。如果我错了,请纠正我,但我相信列表理解和其他内置函数可以比使用循环更有效。 – Nik

+0

事实上,Python经常会伴随一些与列表理解相关的内部优化,但您也必须考虑代码的可读性。另一方面,Python的关键特性不包括性能,所以这一切都取决于代码的用途。 – kaspersky