遍历 string->string dict 只给出每个字符的第一个字符

Moh*_*mel 3 python iterator iterable

我有一个dict如下:

values  = {'A1' : '123456', 'B1' : 123456, ....}
Run Code Online (Sandbox Code Playgroud)

我知道迭代的正确方法是:

for key, value in values.items():
   #do what you want 
Run Code Online (Sandbox Code Playgroud)

错误,我忘记添加.items(),所以我开始变得奇怪KeyError

我尝试打印,但它只获取每个字符串的第一个字符并将其分配给keyvalue

我的问题是:为什么 python 这样做?幕后发生了什么?

Wil*_*sem 5

当你写:

for x1,x2 in iterable:
    # ...
Run Code Online (Sandbox Code Playgroud)

这实际上意味着您在 Python 中进行序列解包。Python 对它的评估如下:

x1,x2 = key0
Run Code Online (Sandbox Code Playgroud)

key0第一个键在哪里(当然还有其他键)。如果key0是一个恰好具有两个元素的可迭代对象,则此方法有效。在这种情况下,第一个元素被分配给x1,第二个元素被分配给x2

现在一个字符串是一个可迭代的,它的元素是字符。所以一个字符串'A1'有两个元素:'A''1'。这意味着如果你写:

key,value = 'A1'
Run Code Online (Sandbox Code Playgroud)

key将举行'A'value将举行'1'。现在,如果您打印key,它将打印该键的第一个值。

在 aforvalues.items()使用 a不是“神奇的表达式”items()只是一个可迭代的,它产生包含一个键和相应值的 2 元组。由于元组也是可迭代的,其中项目是元组的元素,因此元组在键和值中解包。因此,当您编写: 时for key,value in values.items().items()将生成类似('A1','123456'),的序列('B1',123456)。现在,如果将这样的元组分配给key,value,就像写:

key,value = ('A1','123456')
Run Code Online (Sandbox Code Playgroud)

sokey将取元组的第一个元素 ( 'A1') 和value第二个 ( 123456) 。