1

这应该是微不足道的。然而,我对我的把戏并不是 100% 确定的。

我有一个列表列表 (lol ;)),它捕获了图形节点之间的边缘关系。假设我有一个有图,其中有 4 个节点标记为 0、1、2、3。边是 {(0,2),(0,3),(1,0),(1,3),(2, 1)} 所以邻接lol(叫它a)是

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

我现在想找到发生率lol,即一个列表列表,指示哪些节点发生在哪些节点上。对于这个例子,发生率lol(称之为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 解释器会发出语法错误。有没有更好的表达方式?

4

1 回答 1

2

您的问题本质上是关于使用列表推导来解决副作用。正如例如这个问题的答案所说,将其分解为一个 for 循环(或多个循环)是要走的路:

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

另外,请注意,列表推导式用于以非常自然、简单的方式构建列表,就像数学家习惯做的那样。这就是为什么在 Python 中,语法需要方括号(在您的情况下)。

于 2013-01-24T21:31:18.877 回答