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)