与可迭代列表设置差异

时间:2016-10-22 08:25:00

标签: python set

嗨我有问题理解为什么输出是这样的。我理解字符串和列表之间的区别(有一个项目)。但是,我真的不明白这一点,因为列表中有很多项目。

有人可以解释一下吗? :)

似乎只需要'1','4','9'并设置差异..

>>> l = ['3246', '82576', '2476', '19254', '83254', '92576', '19326', '1547', '325769', '3254698', '1', '254698', '354', '1932', '325', '9325', '1927', '32546', '4', '9']
>>> set('123456789')-set(l)
set(['3', '2', '5', '7', '6', '8'])

2 个答案:

答案 0 :(得分:2)

set命令期望迭代转换为集合。因为你只提供一个字符串:

'123456789'

到第一组,它假定这是它,并将此字符串分解为集1,2 ...,9(字符串)。在l中,您只有' 1',' 4'和' 9'对应于这些项目,因此差异将其删除。

答案 1 :(得分:0)

Set expects an iterable将传递给构造函数。

它是如何知道迭代被传递的?

正如this answer解释

  

iter内置检查 iter 方法,或者对于字符串 getitem 方法。要检查对象是否为“列表”而不是“字符串”,则关键是属性 getitem iter

 >>In [9]: hasattr([1,2,3,4], '__iter__')
 >>Out[9]: True
 >>In [11]: hasattr((1,2,3,4), '__iter__')
 >>Out[11]: True
 >>In [12]: hasattr(u"hello", '__iter__')
 >>Out[12]: False
 >>In [14]: hasattr(u"hello", '__getitem__')
 >>Out[14]: True

因此,字符串被分解为各个组件。 并进行进一步的计算。

此外,Set不接受不可迭代的值。

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