在Python中反向索引列表的列表

1 投票
1 回答
1002 浏览
提问于 2025-04-17 13:34

这应该很简单。不过我对我的方法不是百分之百有信心。

我有一个列表的列表(哈哈;)用来表示图中节点之间的边关系。假设我有一个有向图,里面有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中,语法要求使用方括号(在你的例子中)。

撰写回答