1、集合说明
集合(set
)是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。
2、创建一个集合
大括号或 set()
函数可以用来创建集合。注意:想要创建空集合,你必须使用 set()
而不是 {}
。后者用于创建空字典。
创建方法范例:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意,传入的参数[1, 2, 3]
是一个list
,而显示的{1, 2, 3}
只是告诉你这个set
内部有1,2,3这3个元素,显示的顺序也不表示set
是有序的。
集合是没有重复元素的,如果在创建时传入重复元素,则会被自动过滤掉,例如:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
也可以先定义一个list,然后转为set,例如:
>>> basket=['apple','orange','apple','pear','banana']
>>> fruit=set(basket)
>>> fruit
{'pear', 'orange', 'banana', 'apple'}
注意重复元素apple
被自动删掉了,如果是python2.x则返回是set(['orange', 'pear', 'apple', 'banana'])
或者如果我们想获得一个字符串的set集合,可以这样:
>>> a=set('abcdefg')
>>> a
{'f', 'd', 'g', 'a', 'b', 'c', 'e'}
3、添加元素
通过add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> a=set('abcdefg')
>>> a.add('f')
>>> a
{'f', 'd', 'g', 'a', 'b', 'c', 'e'}
>>> a.add('h')
>>> a
{'f', 'h', 'd', 'g', 'a', 'b', 'c', 'e'}
>>>
4、一次性添加多个元素
使用update()
方法可以添加多个元素,范例如下:
>>> a=set('abcdefg')
>>> a.update('hij')
>>> a
{'f', 'h', 'd', 'g', 'j', 'a', 'i', 'b', 'c', 'e'}
5、删除元素
通过remove(key)
方法可以删除元素:
>>> a.remove('h')
>>> a
{'f', 'd', 'g', 'a', 'b', 'c', 'e'}
>>> a.remove('h')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'h'
用这个方法如果要删除的元素不存在,则会报错,所以可以使用s.discard(x)
的方法,此方法如果元素集合s中含有元素x则删除,否则也不会报错;
>>> a.discard('h')
>>>
方法pop()
删除一个随机元素:
>>> a.pop()
'f'
>>> a
{'d', 'g', 'a', 'b', 'c', 'e'}
clear()
清除集合中所有的元素:
>>> a.clear()
>>> a
set()
6、长度
方法’len(s)`即可,范例:
>>> a
{'f', 'h', 'd', 'g', 'j', 'a', 'i', 'b', 'c', 'e'}
>>> len(a)
10
7、包含关系
包含关系用in
或者not in
即可;
- x in s:测试 x 是否是 s 的成员
- x not in s:测试 x 是否不是 s 的成员
>>> a
{'f', 'h', 'd', 'g', 'j', 'a', 'i', 'b', 'c', 'e'}
>>> 'a' in a
True
>>> 'l' in a
False
>>> 'l' not in a
True
8、运算方法
s.issubset(t)
:等价于s <= t
,测试是否s
中的每一个元素都在t
中;s.issuperset(t)
:等价于s >= t
,测试是否t
中的每一个元素都在s
中;s.union(t)
:等价于s | t
,返回一个新的set
包含s
和t
中的每一个元素( t 和 s的并集);s.intersection(t)
:等价于s & t
,返回一个新的set
包含s
和t
中的公共元素(t 和 s的交集);s.difference(t)
:等价于s - t
,返回一个新的set
包含s
中有但是t
中没有的元素(项在t中,但不在s中);s.symmetric_difference(t)
:等价于s ^ t
,返回一个新的set
包含s
和t
中不重复的元素(项在t或s中,但不会同时出现在二者中);s.update(t)
:等价于s |= t
,返回增加了set
“t”中元素后的set
“s”;s.intersection_update(t)
:等价于s &= t
,返回只保留含有set
“t”中元素的set
“s”;s.difference_update(t)
:等价于s -= t
,返回删除了set
“t”中含有的元素后的set
“s”;s.symmetric_difference_update(t)
:等价于s ^= t
,返回含有set
“t”或者set
“s”中有而不是两者都有的元素的 set “s”;
>>> c=set('abcdefg')
>>> b=set('abcd')
>>> d=set('wliaco')
>>> c.issubset(b)
False
>>> c.issuperset(b)
True
>>> c.union(b)
{'a', 'f', 'd', 'g', 'b', 'c', 'e'}
>>> c.intersection(b)
{'d', 'a', 'b', 'c'}
>>> c.difference(b)
{'f', 'g', 'e'}
>>> c.symmetric_difference(d)
{'f', 'd', 'g', 'w', 'e', 'o', 'i', 'l', 'b'}
>>> c.update(d)
>>> c
{'f', 'd', 'g', 'o', 'a', 'i', 'l', 'w', 'b', 'c', 'e'}
>>> c.intersection_update(d)
>>> c
{'o', 'i', 'a', 'l', 'w', 'c'}
>>> c.difference_update(d)
>>> c
set()
>>> b.symmetric_difference_update(d)
>>> b
{'d', 'o', 'i', 'l', 'w', 'b'}
或者不用函数,直接使用运算符:
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # unique letters in a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b # letters in a but not in b
set(['r', 'd', 'b'])
>>> a | b # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b # letters in both a and b
set(['a', 'c'])
>>> a ^ b # letters in a or b but not both
set(['r', 'd', 'b', 'm', 'z', 'l'])
请注意:union()
, intersection()
, difference()
和 symmetric_difference()
的非运算符(non-operator,就是形如s.union()
这样的)版本将会接受任何 iterable
作为参数。相反,它们的运算符版本(operator based counterparts)要求参数必须是sets
。这样可以避免潜在的错误,如:为了更可读而使用 set('abc') & 'cbs'
来替代 set('abc').intersection('cbs')
。从 2.3.1 版本中做的更改:以前所有参数都必须是 sets
。
另外,Set
和ImmutableSet
两者都支持set
与set
之间的比较。两个sets
在也只有在这种情况下是相等的:每一个set
中的元素都是另一个中的元素(二者互为subset)。一个set
比另一个set
小,只有在第一个 set 是第二个set
的subset
时(是一个subset
,但是并不相等)。一个 set 比另一个set
打,只有在第一个 set 是第二个set
的superset
时(是一个superset
,但是并不相等)。
子set
和相等比较并不产生完整的排序功能。例如:任意两个sets
都不相等也不互为子set
,因此以下的运算都会返回False
:a<b
, a==b
, 或者a>b
。因此,sets
不提供 __cmp__
方法。
因为sets
只定义了部分排序功能(subset
关系),list.sort()
方法的输出对于sets
的列表没有定义。
6、其他
复制:
>>> d=set('wliaco')
>>> d.copy()
{'i', 'a', 'l', 'w', 'o', 'c'}
hash(s)返回s的hash值;
7、和dict的区别
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。