Python:添加列表来设置?
testingPython 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可以告诉如果我已经两次添加相同的列表。 有没有解决方法?
编辑:我想添加列表本身,而不是它的元素。
您不能将列表添加到集合,因为列表是可变的,这意味着您可以在将列表添加到集合后更改列表的内容。
但是,您可以将元组添加到集合中,因为您无法更改元组的内容:
>>> a.add(('f', 'g')) >>> print a set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
编辑 :一些解释:文档定义一个set
作为不同可哈希对象的无序集合。 对象必须是可散列的,因此每次执行这些操作时,查找,添加和删除元素都可以比查看每个单独的元素更快。 所使用的具体algorithm在Wikipedia文章中进行了解释。 Pythons哈希algorithm在Python引用中的effbot.org和__hash__
函数中进行了解释。
一些事实:
- 设置元素以及字典键必须是可散列的
- 一些不可用的数据types:
-
list
:使用tuple
来代替 -
set
:使用frozenset
代替 -
dict
:没有官方的对口,但有一些食谱
-
- 对象实例在默认情况下是可哈希的,每个实例都有唯一的哈希。 您可以按照python参考中的说明覆盖此行为。
>>> a = set('abcde') >>> l = ['f', 'g'] >>> a |= set(l) >>> a set(['a', 'c', 'b', 'e', 'd', 'g', 'f'])
联盟运营商比添加快得多。
编辑:如果你想要列表本身而不是它的成员,那么不幸的是你必须使用一个元组。 组员必须是可排除的。
希望这有助于:
>>> 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()
。 该文件说:
用自己和其他人的联合来更新一个集合。
要将列表元素添加到集合 ,请使用update
从https://docs.python.org/2/library/sets.html
s.update(t):返回t中添加元素的集合
例如
>>> s = set([1, 2]) >>> l = [3, 4] >>> s.update(l) >>> s {1, 2, 3, 4}
如果您不想将整个列表作为单个元素添加到集合中,则不能因为列表不可散列。 你可以添加一个元组,例如s.add(tuple(l))
。 另请参见TypeError:在使用内置set函数获取更多信息时, 不可用types:“list” 。
列表对象不可用 。 你可能想把它们变成元组。
集合不能有可变(可更改)的元素/成员。 一个可变的列表不能成为一个集合的成员。
由于套是可变的,你不能有一套! 尽pipe你可以有一套frozensets。
(同样的“可变性要求”适用于字典的键。)
其他答案已经给你代码,我希望这给了一些洞察力。 我希望Alex Martelli能够回答更多的细节。
你想添加一个元组,而不是一个列表:
>>> 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')])
这是我通常如何做的:
def add_list_to_set(my_list, my_set): [my_set.add(each) for each in my_list] return my_set
我发现我今天需要做类似的事情。 algorithm知道什么时候创build了一个需要添加到集合中的新列表,但是当它在列表中完成操作时还没有。
无论如何,我想要的行为是为了使用id
而不是hash
。 因此,我发现mydict[id(mylist)] = mylist
而不是myset.add(mylist)
来提供我想要的行为。
这应该做的:
set(tuple(i) for i in L)