当我们遍历下面的字典时,每次迭代都会(正确地)返回一个键值对
for key, value in dict.items():
print "%s key has the value %s" % (key, value)
'some key'
键的值为'some value'
(重复多次有k,v对)
以上内容对我有意义,但是如果我们这样做:
for key in dict.items():
print "%s key has the value %s" % (key, value)
("some key", "some value")
的值为"some value"
(左元组将遍历每个键值对,右侧值将保留在dict中的第一个值并重复)
我们最终获得在第一个%s
(键)中返回的每个k,v对,而第二个%s
(值)不会迭代,它只返回dict中的第一个值for循环的迭代。
我知道如果你只用for key in dict
进行迭代,那么你只是在迭代密钥。这里因为我们只使用for循环中的键迭代一组元组(通过使用dict.items()
),循环应该与第一个示例运行相同的次数,因为密钥和密钥一样多,价值对。
我遇到的问题是为什么python会在key
的第二个示例中为您提供整个元组。
感谢所有人的帮助 - 我想再添加一个问题。
for a,a in dict.items():
print a
为什么以上打印值,如果我print a,a
- 显然两个值都打印了两次。如果我输入了for a,b
,我会迭代(key,value)
对,所以我逻辑上认为我现在正在迭代(key,key)
对,因此会打印键而不是值。很抱歉只是在翻译中玩弄基本问题,并试图解决问题。
答案 0 :(得分:26)
第一个例子是利用一个称为“元组解包”的东西来打破真正与你单独的例子中相同的元组,分成两个不同的变量。
换句话说:
for key, value in dict.items():
就是这样:
for keyvalue in dict.items():
key, value = keyvalue[0], keyvalue[1]
请记住,for
循环总是迭代你给它的迭代器的各个元素。 dict.items()
返回一个类似于列表的元组对象,因此每次运行for
循环都是一个新元组,如果你在key, value
中定义它,会自动解压缩到for
}循环。
以这种方式思考可能会有所帮助:
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)
N.B。你的代码唯一的原因
for key in dict.items():
print "%s key has value: %s" % (key, value)
不抛出NameError
是因为已经从代码中的其他位置定义了value
。由于您没有在value
循环中的任何位置定义for
,否则会抛出异常。
答案 1 :(得分:0)
在第二个例子中,你给的是你没有分配"值"对任何事情:
请注意这里的小编辑:
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 =(,) 这可能不是你想要的。