在Python 2.6解释器上测试:
>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
a.add(l)
TypeError: list objects are unhashable
Run Code Online (Sandbox Code Playgroud)
我认为我无法将列表添加到集合中,因为Python无法判断如果我已经两次添加相同的列表.有解决方法吗?
编辑:我想添加列表本身,而不是其元素.
aeh*_*lke 494
使用set.update()或|=
>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
{'e', 'b', 'c', 'd', 'a'}
>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}
Run Code Online (Sandbox Code Playgroud)
编辑:如果你想添加列表本身而不是它的成员,那么你不得不使用元组.套装成员必须是可以清洗的.
Ott*_*ger 169
您无法将列表添加到集合中,因为列表是可变的,这意味着您可以在将列表添加到集合后更改列表的内容.
但是,您可以将元组添加到集合中,因为您无法更改元组的内容:
>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
Run Code Online (Sandbox Code Playgroud)
编辑:一些解释:文档将a定义set为不同的可清除对象的无序集合.对象必须是可清除的,这样每次执行这些操作时,查找,添加和删除元素的速度都比查看每个元素要快.维基百科文章解释了使用的具体算法.蟒散列算法是在解释effbot.org和蟒__hash__在功能蟒参考.
一些事实:
list:tuple改用set:frozenset改用dict:没有官方对应物,但有一些
食谱JDi*_*teo 68
要将列表的元素添加到集合,请使用update
来自https://docs.python.org/2/library/sets.html
s.update(t):返回集合s,其元素从t添加
例如
>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)
如果您想要将整个列表作为单个元素添加到集合中,则不能因为列表不可清除.你可以改为添加一个元组,例如s.add(tuple(l)).另请参见TypeError:unhashable类型:使用内置set函数时的'list'以获取更多信息.
alv*_*vas 40
希望这有助于:
>>> 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'])
Run Code Online (Sandbox Code Playgroud)
小智 15
请注意功能set.update().文件说:
使用自身和其他人的联合更新集合.
我发现我今天需要做一些类似的事情。该算法知道它何时创建需要添加到集合中的新列表,但不知道它何时完成对列表的操作。
无论如何,我想要的行为是 set 使用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')])
Run Code Online (Sandbox Code Playgroud)
如果你有一个列表,你可以转换为元组,如上所示。元组是不可变的,因此可以将其添加到集合中。
集合不能具有可变(可变)元素/成员.一个可变的列表不能是一个集合的成员.
由于集合是可变的,因此您不能拥有一组集合!你可以拥有一套frozensets.
(同一种"可变性要求"适用于字典的键.)
其他答案已经给你代码,我希望这给了一些洞察力.我希望Alex Martelli能够回答更多细节.