如何将值列表添加到现有集?
您不能将列表添加到集合中,因为列表是可变的,这意味着您可以在将列表添加到集合后更改列表的内容。
然而,你可以向集合中添加元组,因为你不能改变元组的内容:
>>> a.add(('f', 'g')) >>> print a set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
编辑:一些解释:文档将set定义为不同哈希对象的无序集合。对象必须是可哈希的,这样在每次执行这些操作时,查找、添加和删除元素可以比查看每个单独的元素更快。使用的具体算法在维基百科的文章中解释。python的哈希算法在effbot.org中解释,python的__hash__函数在python的参考中解释。
set
__hash__
一些事实:
list
tuple
frozenset
dict
使用set.update()或|=操作符:
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'}
不可能直接将列表本身添加到set中,因为set元素必须是hashable。
相反,可以先将列表转换为元组:
>>> a = {('a', 'b', 'c')} >>> xs = ['d', 'e'] >>> a.add(tuple(xs)) >>> a {('a', 'b', 'c'), ('d', 'e')}
列表对象是不可哈希的。你可能想把它们转换成元组。
您将希望使用可哈希的元组(不能像列表那样对可变对象进行哈希)。
>>> 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')])
你想添加一个元组,而不是一个列表:
>>> 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')])
如果您有一个列表,您可以转换为元组,如上所示。元组是不可变的,所以它可以被添加到集合中。
集合不能有可变的元素/成员。列表是可变的,不能是集合的成员。
(同样的“可变性要求”也适用于字典的键。)
我发现我今天也需要做一些类似的事情。该算法知道何时创建一个需要添加到集合中的新列表,但不知道何时完成对列表的操作。
无论如何,我想要的行为是set使用id而不是hash。因此,我发现mydict[id(mylist)] = mylist而不是myset.add(mylist)提供我想要的行为。
id
hash
mydict[id(mylist)] = mylist
myset.add(mylist)
请注意函数set.update()。文件说:
用集合本身和其他集合的并集更新集合。
希望这能有所帮助:
>>> 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'])
我通常是这样做的:
def add_list_to_set(my_list, my_set): [my_set.add(each) for each in my_list] return my_set
要将列表中的元素添加到集合中,使用update
update
从https://docs.python.org/2/library/sets.html
s.update(t):返回包含从t中添加的元素的集合s
如。
>>> s = set([1, 2]) >>> l = [3, 4] >>> s.update(l) >>> s {1, 2, 3, 4}
如果相反,你想要将整个列表作为单个元素添加到集合,你不能,因为列表是不可哈希的。你可以添加一个元组,例如s.add(tuple(l))。更多信息请参见type: 'list'使用内置的set函数时。
s.add(tuple(l))
尝试使用*解包,如下所示:
*
>>> a=set('abcde') >>> a {'a', 'd', 'e', 'b', 'c'} >>> l=['f','g'] >>> l ['f', 'g'] >>> {*l, *a} {'a', 'd', 'e', 'f', 'b', 'g', 'c'} >>>
非编辑器版本:
a=set('abcde') l=['f', 'g'] print({*l, *a})
输出:
{'a', 'd', 'e', 'f', 'b', 'g', 'c'}
联合是最简单的方法:
list0 = ['a', 'b', 'c'] set0 = set() set0.add('d') set0.add('e') set0.add('f') set0 = set0.union(list0) print(set0)
{'b', 'd', 'f', 'c', 'a', 'e'}