python - python中迭代下的字典问题

标签 python dictionary

基本上,这个程序将根据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/

相关文章:

python - 如何逐行读取Excel文件并将其传递到curl命令中?

python - 如何处理原始 Python 套接字中的 ssl 连接?

python:对有序字典进行排序

python - 如何扩展字典的文件路径

python - 在Python中转换嵌套的字典列表

Python MySQL 标准

python - Python 的 super() 如何处理多重继承?

python - 在 Turtle 中单击时增加并显示数字

javascript - 在 map 中的特定索引处插入

c# - 使用子字符串搜索对象书的字典值