我如何将一系列数值添加到现有集合中?
使用 set.update()
或者 |=
操作符:
>>> a = set('abc')
>>> a
{'a', 'b', 'c'}
>>> xs = ['d', 'e']
>>> a.update(xs)
>>> a
{'e', 'b', 'c', 'd', 'a'}
>>> xs = ['f', 'g']
>>> a |= set(xs)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}
直接将列表本身添加到集合中是不可能的,因为集合元素必须是可哈希的。
相反,可以先将列表转换为元组:
>>> a = {('a', 'b', 'c')}
>>> xs = ['d', 'e']
>>> a.add(tuple(xs))
>>> a
{('a', 'b', 'c'), ('d', 'e')}
|
执行并集操作。 |=
运算符和 set.update()
方法都是在原地应用该操作且实际上是等效的。因此,set_a |= set_b
可以视为 set_a.update(set_b)
和 set_a = set_a | set_b
的语法糖(除了在后一种情况下,重复使用相同的set_a
对象而不是重新赋值)。 - Cecil Curry无法将列表添加到集合中,因为列表是可变的,这意味着您可以在将其添加到集合后更改列表内容。
但是,您可以将元组添加到集合中,因为您无法更改元组的内容:
>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
编辑: 一些解释:文档将set
定义为“无序但不重复的可哈希对象集合”。这些对象必须是可哈希的,以便在执行查找、添加和删除元素操作时比逐个查看每个元素更快。具体使用的算法在维基百科文章中有解释。Python 的哈希算法在effbot.org上有解释,而 Python 的 __hash__
函数在python 参考手册中有解释。
一些事实:
list
:使用tuple
代替set
:使用frozenset
代替dict
:没有官方对应物,但有一些解决方案collections.namedtuple
可以被视为 dict
的“官方”对应物。 - SilentGhostdict
)的情况,OrderedDict
从collections
库中可以使用? - Charlie Parkerupdate
将列表的元素添加到集合中。例如:s.update(t):从t中返回添加到集合s的元素后的集合s。
>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}
如果您想将整个列表作为单个元素添加到集合中,则无法执行此操作,因为列表不可哈希。 您可以添加一个元组,例如 s.add(tuple(l))
。有关更多信息,请参见TypeError:unhashable type:'list' when using built-in set function。
希望这能帮到你:
>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])
set.update()
。文档上写道:
使用自身和其他集合的并集更新一个集合。
list对象是不可哈希的。虽然您可能希望将它们转换为元组。
集合不能有可变元素/成员。由于列表是可变的,因此不能成为集合的成员。
由于集合是可变的,因此您不能拥有一个集合的集合!但是,您可以拥有一个frozensets的集合。
(同样适用于字典的键的“可变性要求”.)
其他答案已经给出了代码,我希望这能提供一些见解。我希望Alex Martelli会回答更多细节。
id
而不是hash
。因此,我发现mydict[id(mylist)] = mylist
可以提供我想要的行为,而不是myset.add(mylist)
。>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
您需要使用元组,它们是可哈希的(无法哈希可变对象如列表)。
>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])