在Python中反向索引列表的列表
这应该很简单。不过我对我的方法不是百分之百有信心。
我有一个列表的列表(哈哈;)用来表示图中节点之间的边关系。假设我有一个有向图,里面有4个节点,分别标记为0、1、2、3。边的关系是 {(0,2),(0,3),(1,0),(1,3),(2,1)},所以邻接列表(我们叫它 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解释器就会报语法错误。有没有更好的写法呢?
1 个回答
2
你的问题其实是在问如何使用列表推导式来产生副作用。就像这个问题的回答所说的,把它拆分成一个或多个for循环是更好的做法。
for i, x in enumerate(a):
for j in x:
b[j].append(i)
另外,请注意,列表推导式是用来很自然、简单地构建列表的,就像数学家做的那样。这就是为什么在Python中,语法要求使用方括号(在你的例子中)。