尝试解压缩集时出现TypeError与ValueError

时间:2014-01-10 18:26:23

标签: python iterable-unpacking

为什么以下两个代码段会产生不同的错误? 我理解字符串是可迭代的,但是我不明白为什么这会在这里重要,因为集合是被迭代的对象。

s = set([1, 2])        
for one, two in s:
  print one, two

加注

Traceback (most recent call last):
  File "asdf.py", line 86, in <module>
    for one, two in s:
TypeError: 'int' object is not iterable

s2 = set(['a', 'b'])
for one, two in s2:
  print one, two 

加注

Traceback (most recent call last):
  File "asdf.py", line 90, in <module>
    for one, two in s2:
ValueError: need more than 1 value to unpack

2 个答案:

答案 0 :(得分:6)

字符串也是一个序列;你可以将字符串解压缩成单独的字符:

>>> a, b = 'cd'
>>> a
'c'
>>> b
'd'

ValueError被引发,因为长度为1的字符串无法解压缩到两个目标中。

然而,当循环遍历整数序列时,您试图将每个整数值解包为两个目标,并且整数根本不可迭代。这是一个TypeError,因为这与您尝试解压缩的对象类型直接相关:

>>> a, b = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

将此与字符串,列表,元组,迭代器,生成器等进行比较,这些类型都是 可迭代的类型。

如果您想直接解压缩集,请不要使用for循环:

>>> a, b = set([1, 2])
>>> a
1
>>> b
2

但确实知道集合没有固定的顺序(就像字典一样),并且分配值的顺序取决于插入和删除集合的确切历史记录。

答案 1 :(得分:2)

您的for循环可能比您预期的更深。你试图解开集合中的个别成员,而不是集合本身。在第一个示例中,成员是1,第二个成员是a。没有两个值。

您可能想要的是one, two = s

你也可以写下来找到这个:

>>> s = set([1, 2])
>>> for one_two in s:
...     print one_two
1
2