测试在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
我认为,因为没有办法Python可以说如果我已经添加了相同的列表两次,我不能在列表中添加到组。 有没有解决办法?
编辑:我要添加列表本身,而不是它的元素。
Answer 1:
不能将列表添加到一组,因为列表是可变的,这意味着你可以将它添加到组后更改列表的内容。
您可以但是元组添加到该集合,因为你不能改变一个元组的内容:
>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
编辑 :一些解释:该文档定义了一set
为不同的可哈希对象的无序集合。 该对象必须是可哈希,使查找,添加和删除元素可以做的比你每次执行这些操作时间看每个元素更快。 所用的具体算法中解释维基百科的文章 。 蟒散列算法是在解释effbot.org和蟒__hash__
在功能蟒参考 。
一些事实:
- SET元件以及字典键必须是可哈希
- 有些unhashable数据类型:
-
list
:使用tuple
,而不是 -
set
:使用frozenset
代替 -
dict
:没有官方的对应,但也有一些食谱
- 对象实例在默认情况下具有独特的散列每个实例哈希的。 如蟒蛇参考说明,您可以覆盖此行为。
Answer 2:
使用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'}
编辑:如果您要添加的列表本身,而不是它的成员,那么你必须使用一个元组,很遗憾。 集成员必须是可哈希 。
Answer 3:
要在列表的元素添加到组 ,使用update
从https://docs.python.org/2/library/sets.html
s.update(T):返回集合S的元素从吨加入
如
>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}
如果你不是想整个列表添加为一个单一的元素集合,你不能因为名单没有哈希的。 您可以改为添加一个元组,如s.add(tuple(l))
另请参见类型错误:unhashable类型:“名单”当使用内置的设置功能为上的更多信息。
Answer 4:
希望这有助于:
>>> 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'])
Answer 5:
请注意函数set.update()
该文件说:
更新一组与自身和其他工会。
Answer 6:
列表对象是unhashable。 你可能会想,虽然把它们中的元组。
Answer 7:
集不能具有可变(可变)元件/构件。 列表,是可变的,不能是一组的成员。
作为集是可变的,你不能有一组套! 你可以有一组frozensets的虽然。
(同类的“可变性要求”适用于字典的键。)
其他答案已经给了你的代码,我希望这给一些真知灼见。 我希望亚历克斯·马尔泰利将更加详细回答。
Answer 8:
你想添加一个元组,而不是一个列表:
>>> 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')])
如果你有一个列表,你可以转换成元组,如上图所示。 元组是不可变的,因此它可以被添加到组。
Answer 9:
您将要使用的元组,这是哈希的(你无法散列可变对象如列表)。
>>> 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')])
Answer 10:
我发现我需要类似目前的做一些事情。 当它被创建需要添加到该组的新列表的算法知道,但不是它何时会完成名单上运行。
无论如何,我想要的行为是对集中使用id
,而不是hash
。 这样我发现mydict[id(mylist)] = mylist
代替myset.add(mylist)
提供我想要的行为。
Answer 11:
下面是我经常做的:
def add_list_to_set(my_list, my_set):
[my_set.add(each) for each in my_list]
return my_set
Answer 12:
这应该这样做:
set(tuple(i) for i in L)
文章来源: Python: Add list to set?