字典迭代 -- for dict 与 for dict.items()
当我们遍历下面这个字典时,每次循环都会正确地返回一个键值对。
for key, value in dict.items():
print "%s key has the value %s" % (key, value)
'some key'
这个键对应的值是 'some value'
(这个过程会重复,直到所有的键值对都被遍历完)。
以上的内容我能理解,但如果我们这样做:
for key in dict.items():
print "%s key has the value %s" % (key, value)
("some key", "some value")
这个元组的值是 "some value"
(左边的元组会遍历每个键值对,而右边的值会一直保持在字典中的第一个值,并重复这个值)。
最终,我们在第一次 %s
(键)中得到了每个键值对,而第二个 %s
(值)并没有遍历,它只是对每次循环返回字典中的第一个值。
我明白如果只用 for key in dict
来遍历,那么你只是在遍历键。这里因为我们使用 dict.items()
遍历一组元组,而在循环中只用到了键,所以这个循环的次数应该和第一个例子一样,因为键的数量和键值对的数量是相等的。
我现在困惑的是,为什么在第二个例子中,Python会给你整个元组作为 key
。
谢谢大家的帮助——我想再问一个问题。
for a,a in dict.items():
print a
为什么上面的代码会打印出值,如果我 print a,a
- 显然两个值都会被打印两次。如果我输入 for a,b
,我会遍历 (key,value)
对,所以我逻辑上会认为我现在是在遍历 (key,key)
对,因此应该打印键而不是值。抱歉问这些基础问题,我只是想在解释器里玩玩,试着弄明白一些东西。
2 个回答
在你给的第二个例子中,你并没有把“value”赋值给任何东西:
这里有个小修改:
for key in dict: ##Removed call to items() because we just want the key,
##Not the key, value pair
value = dict[key] # Added this line
print "%s key has the value %s (key, value)
注意:
在第二个例子中,你现在可以调用 dict.keys() 或者直接用 dict(在 for 循环中引用字典会返回它的键)。但是调用 dict.items() 会让你感到困惑,因为它会把键值对赋值成 key=(, ),这可能不是你想要的结果。
for key in dict.items():
print "%s key has value: %s" % (key, value)
第一个例子使用了一种叫做“元组解包”的技术,把其实质上是同一个元组的内容,分解成两个不同的变量。
换句话说,这个:
for key, value in dict.items():
其实就是这个:
for keyvalue in dict.items():
key, value = keyvalue[0], keyvalue[1]
记住,for
循环总是会遍历你给它的迭代器中的每一个元素。dict.items()
返回的是一个类似列表的元组对象,所以每次执行 for
循环时,都会得到一个新的元组,如果你在 for
循环中这样定义,它会自动解包成 key, value
。
可以这样理解:
d = {'a':1, 'b':2, 'c':3}
list(d) # ['a', 'b', 'c'] the keys
list(d.keys()) # ['a', 'b', 'c'] the keys
list(d.values()) # [1, 2, 3] the values
list(d.items()) # [('a',1), ('b',2), ('c',3)] a tuple of (key, value)
注意,你的代码之所以没有抛出 NameError
错误,是因为 value
在你代码的其他地方已经被定义了。由于你在这个 for
循环中并没有定义 value
,否则它会抛出一个异常。