为什么“ in”对键有效,但对字符串无效?

时间:2018-10-01 18:33:10

标签: 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))

3 个答案:

答案 0 :(得分:7)

两个循环都中断了。第一个只有 happens 起作用,这是因为test恰好是两个字符长,所以可以分解成两个变量xy

要遍历字典的键和值,请写:

for k,v in d.items():
    ...

如果您只想要按键,可以这样做:

for k in d:
    ...

详细地说,当您遍历字典时,它将遍历键。

for x,y in test_dict

该字典只有一个键"ab"。因此,在第一个也是唯一的迭代中,它将字符串分配给xy,就像您写过一样:

x,y = "ab"

碰巧,这是有效的拆包。左侧有两个变量,右侧有两个项目的容器。 x变成"a",而y变成"b"

如果test更长或更短,则第一个循环也会崩溃,原因是“需要解压缩的N个以上的值”或“要解压缩的多个值”。

  

为什么在一种情况下字符串不能解包,而在另一种情况下不能解包?

第二个循环直接遍历字符串"ab"。当您遍历字符串时,它将字符串拆分为单字符字符串。第一次迭代是"a",第二次迭代是"b"。在第一次迭代中,它尝试执行以下操作:

x,y = "a"

此分配失败,“需要解压多个值”,因为左侧有两个变量,右侧只有一个字符。

答案 1 :(得分:5)

对于字典情况,您正在迭代字典键。 for x, y in test_dict的意思是“对于test_dict中的每个键,请取其键并解压缩为变量xy。由于唯一的键是'ab',因此将字符串解压缩到x = 'a'y = 'b'。当然,这特别有效,因为您唯一的字符串键的长度为2。

对于字符串情况,您正在迭代一个字符串。 for x, y in test将失败。您不能说“对于test中的每个字符都解压缩为多个变量”,因为单个字符是不可迭代的。相反,您将遇到:

ValueError: not enough values to unpack (expected 2, got 1)

答案 2 :(得分:1)

for x,y in test:
  print('%s %s' % (x,y))

由于test是一个类似列表的对象(python中的字符串是类似列表的对象),因此对其进行迭代将依次获取每个字符。字符不是长度为2的类似列表的对象,因此尝试将其拆分为xy会产生错误。 如果您有test = ("ab", "bc"),则test将是一个包含成对字符的元组,可以使用上面的表达式进行拆分。 这是一个很短的答案,但我希望它可以澄清正在发生的事情。

在dict情况下起作用的原因稍微复杂一些,但不是很复杂。当您遍历python中的字典时,您实际上遍历了它的键。这意味着您有一个包含一个长度为2的字符串的项目的列表。如上所示,长度为2的字符串可以解压缩为它的第一个和第二个字符,这就是该语句起作用的原因。