我有一本字典,我想从字典中删除一个键并将其更改为其他内容。然而,当我循环浏览字典时,最后一个键发生了一些奇怪的事情,我不明白。
在这里,我打印了删除 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/