基本上,这个程序将根据seqs
找到每个节点的所有邻居
。 Seqs表示每个节点的方向性。例如,[1, 2]
表示 1 指向 2。我使用字典将节点存储为键,将其邻居
存储为值。
seqs = [[1,2],[1,3],[2,3]]
nodes = {}
neighbors = set()
for i in range(len(seqs)):
for j in range(len(seqs[i]) - 1, 0, -1):
neighbors.add(seqs[i][j - 1])
nodes[seqs[i][j]] = neighbors
print(nodes)
节点的结果应该是{2: {1}, 3: {1, 2}}
,但结果是{2: {1, 2}, 3:{1, 2}}
。在最后一次迭代中,只应更新 3 的值,但两个值都会更新。我对此感到困惑。
最佳答案
这是一个有趣的问题,当我第一次读到它时,我并没有意识到这一点。你的逻辑是对的,但是唉!您已在循环外部定义了 neighbors
,并将名称 neighbors
分配给该集合,然后设置 nodes[2] = Neighbors
。这里需要注意的一点是,这里的 neighbors 只是集合的名称,nodes[2] 得到的是相同的集合。因此,在后续迭代中,当您修改 nodes[3]
的 neighbors
时,集合 (neighbors
) 的值会发生更改,因此执行节点[2]
。您需要的是 copy()
,以便将集合的副本传递给 nodes[2]
而不是实际的集合:
nodes = {}
neighbors = set()
for i in range(len(seqs)):
for j in range(len(seqs[i]) - 1, 0, -1):
neighbors.add(seqs[i][j - 1])
nodes[seqs[i][j]] = neighbors.copy()
print(nodes)
输出:
{2: {1}}
{2: {1}, 3: {1}}
{2: {1}, 3: {1, 2}}
关于python - python中迭代下的字典问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143525/