我有dict
如下:
values = {'A1' : '123456', 'B1' : 123456, ....}
我知道迭代的正确方法是:
for key, value in values.items():
#do what you want
错误地,我忘了添加.items()
,所以我开始变得奇怪KeyError
我尝试打印,只获得每个字符串的第一个字符并将其分配给key
和value
我的问题是:为什么python这样做?现场背后发生了什么?
答案 0 :(得分:3)
当你写:
for x1,x2 in iterable:
# ...
实际上意味着你在Python中执行序列解包。 Python将其评估为:
x1,x2 = key0
key0
是第一个键(当然还有其他键)。如果key0
是一个具有完全两个元素的可迭代,则此方法有效。在这种情况下,第一个元素分配给x1
,第二个元素分配给x2
。
现在字符串是一个可迭代的,其元素是字符。因此,字符串'A1'
包含两个元素:'A'
和'1'
。这意味着如果你写:
key,value = 'A1'
key
将保留'A'
,value
将保留'1'
。现在,如果您打印key
,它将打印密钥的第一个值。
在for
上使用 values.items()
不是“神奇的表达”:items()
只是一个可迭代的,它会产生包含密钥的2元组和相应的价值。由于元组也是可迭代的,其中项是元组的元素,因此元组在键和值中被解包。因此,当您撰写:for key,value in values.items()
时,.items()
会生成类似('A1','123456')
,('B1',123456)
的序列。现在,如果将这样的元组分配给key,value
,就像写作:
key,value = ('A1','123456')
因此key
将获取元组的第一个元素('A1'
)和value
第二个元素(123456
)。
答案 1 :(得分:2)
这样想:
values = {'A1' : '123', 'B1' : 456}
for key, value in values.items():
#do what you want, e.g.
print(key)
print(value)
# result:
# A1
# 123
# B1
# 456
现在,没有.items()
:
values = {'A1' : '123', 'B1' : 456}
for entry in values:
print(entry)
a,b = entry
#do what you want, e.g.
print(a)
print(b)
# result:
# A1
# A
# 1
# B1
# B
# 1
正如您所看到的,脚本正在读取每个字典键并从中获取前两个元素(字符串的行为类似于列表)。