字典迭代 -- for dict 与 for dict.items()

20 投票
2 回答
51446 浏览
提问于 2025-04-18 13:19

当我们遍历下面这个字典时,每次循环都会正确地返回一个键值对。

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 个回答

0

在你给的第二个例子中,你并没有把“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=(, ),这可能不是你想要的结果。

28
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,否则它会抛出一个异常。

撰写回答