迭代通过string->字符串dict只给出每个字符的第一个字符

时间:2017-04-17 16:30:41

标签: python iterator iterable

我有dict如下:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

当你写:

for x1,x2 in iterable:
    # ...

实际上意味着你在Python中执行序列解包。 Python将其评估为:

x1,x2 = key0

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

现在字符串是一个可迭代的,其元素是字符。因此,字符串'A1'包含两个元素:'A''1'。这意味着如果你写:

key,value = 'A1'

key将保留'A'value将保留'1'。现在,如果您打印key,它将打印密钥的第一个值。

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

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

因此key将获取元组的第一个元素('A1')和value第二个元素(123456)。

答案 1 :(得分:2)

这样想:

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

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