3 python string dictionary iterable-unpacking
今天我在Python中遇到了一个非常奇怪的字符串和字典.有人可以向我解释为什么print语句在第一个for循环中工作但在第二个for循环中失败?
test = 'ab'
test_dict = {}
test_dict[test] = 1
for x, y in test_dict:
print('%s %s' % (x,y))
for x,y in test:
print('%s %s' % (x,y))
Run Code Online (Sandbox Code Playgroud)
两个循环都坏了.第一个只是碰巧工作,因为非常具体的巧合恰好test是两个字符长,所以可以解压缩成两个变量x和y.
要迭代dict的键和值,请写:
for k,v in d.items():
...
Run Code Online (Sandbox Code Playgroud)
如果你只想要钥匙,你可以做:
for k in d:
...
Run Code Online (Sandbox Code Playgroud)
详细地说,当你遍历一个字典时,它会遍历键.
for x,y in test_dict
Run Code Online (Sandbox Code Playgroud)
dict只有一个键,"ab".因此,在第一次也是唯一一次迭代中,它将该字符串分配给x并且y就像您编写的那样:
x,y = "ab"
Run Code Online (Sandbox Code Playgroud)
碰巧,这是一个有效的解包.左侧有两个变量,右侧是两个项目的容器.x变"a"和y变"b".
如果test更长或更短,第一个循环也会因"需要超过N值来解包"或"太多值来解包"而崩溃.
为什么字符串在1个场景中解压缩但在另一个场景中没有解压缩?
第二个循环"ab"直接迭代字符串.迭代字符串时,它会将字符串分解为单字符字符串.第一次迭代是"a"第二次迭代"b".在第一次迭代中,它尝试执行:
x,y = "a"
Run Code Online (Sandbox Code Playgroud)
此赋值失败,"需要超过1个值才能解包",因为左侧有两个变量,右侧只有一个字符.
对于字典大小写,您正在迭代字典键.for x, y in test_dict意思是"在每个关键test_dict带钥匙,并解压缩到变量x和y".由于唯一的键是'ab',字符串被解压缩到x = 'a'和y = 'b'.当然,这特别有效,因为您唯一的字符串键长度为2.
对于字符串大小写,您正在迭代一个字符串.for x, y in test将失败.您不能说" test解压缩到多个变量中的每个字符",因为单个字符不可迭代.相反,你会遇到:
ValueError: not enough values to unpack (expected 2, got 1)
Run Code Online (Sandbox Code Playgroud)