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

Sol*_*xun 16 python dictionary

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

for key, value in dict.items():
    print "%s key has the value %s" % (key, value)
Run Code Online (Sandbox Code Playgroud)

'some key'key有值'some value'(重复多次有ak,v对)

以上内容对我有意义,但是如果我们这样做:

for key in dict.items():
    print "%s key has the value %s" % (key, value)
Run Code Online (Sandbox Code Playgroud)

("some key", "some value")有值"some value"(左元组将迭代每个键值对,右值将保持在字典中的第一个值并重复)

我们最终获得在第一个%s(键)和第二个%s(值)中返回的每个k,v对不迭代,它只返回for循环的每次迭代的dict中的第一个值.

我明白,如果你只是迭代,for key in dict那么你只是在迭代密钥.这里因为我们dict.items()只使用for循环中的键来迭代一组元组(通过使用),所以循环应该运行与第一个示例相同的次数,因为密钥和值对的密钥数量相同.

我抓到的麻烦是为什么python在第二个例子中为你提供了整个元组key.


感谢所有人的帮助 - 我想再添加一个问题.

for a,a in dict.items():
    print a
Run Code Online (Sandbox Code Playgroud)

为什么以上打印值,如果我print a,a- 显然两个值都打印两次.如果我输入了,for a,b我会迭代(key,value)对,所以我逻辑上认为我现在迭代(key,key)对,因此打印键而不是值.对不起,只是在解释器中玩弄基本问题并尝试解决问题.

Ada*_*ith 26

第一个例子是利用一个称为"元组解包"的东西来打破真正与你单独的例子中的元组相同的元组,分成两个不同的变量.

换句话说:

for key, value in dict.items():
Run Code Online (Sandbox Code Playgroud)

就是这样:

for keyvalue in dict.items():
    key, value = keyvalue[0], keyvalue[1]
Run Code Online (Sandbox Code Playgroud)

请记住,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)
Run Code Online (Sandbox Code Playgroud)

请注意,您的代码唯一的原因

for key in dict.items():
    print "%s key has value: %s" % (key, value)
Run Code Online (Sandbox Code Playgroud)

不抛出NameError是因为value已经从代码中的其他地方定义了.由于您没有value在该for循环中定义任何位置,否则会抛出异常.