python - 循环遍历字典时删除和添加键

标签 python dictionary for-loop

我有一本字典,我想从字典中删除一个键并将其更改为其他内容。然而,当我循环浏览字典时,最后一个键发生了一些奇怪的事情,我不明白。

在这里,我打印了删除 key 并在其位置添加新 key 之前和之后的 key

from operator import add

x = {(19,2):0, (1,1):1, (10,1):2, (5,5):3}
y = (1, 0)

for i in x.values():

    newDir = tuple(map(add, x.keys()[i], y))
    print x.keys()[i]
    x.pop( x.keys()[i] )
    x[newDir] = i

    print x.keys()[i]
    print i
    print ' '

这会产生以下结果:

(19, 2)
(20, 2)
0

(1, 1)
(2, 1)
1

(10, 1)
(2, 1)
2

(11, 1)
(2, 1)
3

请注意,值 3 的键不是 (5,5) 而是 (11,1),在弹出并添加新键后,它应该是(6,5) 而不是 (2,1)。我不知道 (11,1) 来自哪里,也不知道为什么 (2,1) 在值 2 和 3 中重复。

正确的输出是

(19, 2)
(20, 2)
0

(1, 1)
(2, 1)
1

(10, 1)
(11, 1)
2

(5, 5)
(6, 5)
3

最佳答案

字典是无序的,每当您添加/删除键时,它们的表观顺序可能会发生变化。这意味着x.keys()[i]不保证为您提供正确的 key (至少在您通过添加或删除 key 更改 x 之后)。因为在弹出并添加新 key 后,顺序可能会发生变化,这意味着 x.keys()[i] 可以给出字典中的任何键。

例如在您的输出中

  • 为第一个工作:(19, 2) -> (20, 2) .
  • 它也适用于第二个:(1, 1) -> (2, 1) .
  • 第三个开始失败:(10, 1) -> (2, 1) !找到并修改了正确的 key ,但“明显”结果是值 1 的结果!
  • 第四个一切都坏了:(11, 1)是值的关键 2更改后,明显的结果是值的关键 1 .

因此,您应该创建一个新字典,而不是就地更改它:

from operator import add

x = {(19,2):0, (1,1):1, (10,1):2, (5,5):3}
y = (1, 0)
newx = {}

for key, value in x.items():
    print(key)

    newDir = tuple(map(add, key, y))
    newx[newDir] = value

    print(newDir)
    print(value)
    print(' ')

print(newx)

产生预期的输出:

(19, 2)
(20, 2)
0

(1, 1)
(2, 1)
1

(10, 1)
(11, 1)
2

(5, 5)
(6, 5)
3

{(20, 2): 0, (11, 1): 2, (6, 5): 3, (2, 1): 1}

关于python - 循环遍历字典时删除和添加键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45027356/

相关文章:

python - 学习根据历史预测 future 客户的行为

python - 计算单词的频率以及与该单词相关的不同 id 的数量

python - 检查回文的偶数/奇数?

arrays - for 循环的简洁数学符号

C++11 用于每个具有多个变量的循环

java - 将字符串解析为 Java 方法

python - 从 csv.dictreader 排序和过滤数据

python - 检查字典数组中的键值对并相应更新另一个列表

python - 更改字典中的多个键,同时在 Python 中执行 timedelta 操作

algorithm - 基于字典的压缩算法的最佳子串选择