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

Iterating through string->string dict gives only the first character for each

我有一个dict如下:

values  = {'A1' : '123456', 'B1' : 123456, ....}

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

for key, value in values.items():
   #do what you want 

不小心忘了加.items()所以我开始觉得奇怪KeyError

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

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

当你写:

for x1,x2 in iterable:
    # ...

这实际上意味着您在 Python 中执行 序列解包 。 Python 评价如下:

x1,x2 = key0

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

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

key,value = 'A1'

key 将保持 'A'value 将保持 '1'。现在,如果您打印 key,它将因此打印键的 first 值。

values.items() 上使用 for 不是 "magical expression"items() 只是一个产生 2-包含键和相应值的元组。由于元组也是可迭代的,其中项是元组的元素,因此元组在键和值中解包。所以当你写:for key,value in values.items()时,.items()会生成一个像('A1','123456')('B1',123456)这样的序列。现在如果这样的元组被分配给 key,value,就像这样写:

key,value = ('A1','123456')

所以 key 将取元组的第一个元素 ('A1') 和 value 第二个 (123456).

这样想:

values  = {'A1' : '123', 'B1' : 456}

for key, value in values.items():
    #do what you want, e.g.
    print(key)
    print(value)

# result:
# A1
# 123
# B1
# 456

现在,没有 .items()

values  = {'A1' : '123', 'B1' : 456}

for entry in values:
    print(entry)
    a,b = entry
    #do what you want, e.g.
    print(a)
    print(b)

# result:
# A1
# A
# 1
# B1
# B
# 1

如您所见,脚本正在读取每个字典键并从中获取前 2 个元素(字符串的行为类似于列表)。