字典迭代 - 用于dict与dict.items()

时间:2014-07-14 21:59:00

标签: python dictionary

当我们遍历下面的字典时,每次迭代都会(正确地)返回一个键值对

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)对,因此会打印键而不是值。很抱歉只是在翻译中玩弄基本问题,并试图解决问题。

2 个答案:

答案 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 =(,) 这可能不是你想要的。