【python学习笔记】set集合

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包含st中的每一个元素( t 和 s的并集);
  • s.intersection(t):等价于s & t,返回一个新的set包含st中的公共元素(t 和 s的交集);
  • s.difference(t):等价于s - t,返回一个新的set包含s中有但是t中没有的元素(项在t中,但不在s中);
  • s.symmetric_difference(t):等价于s ^ t,返回一个新的 set 包含st中不重复的元素(项在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
另外,SetImmutableSet两者都支持setset之间的比较。两个sets在也只有在这种情况下是相等的:每一个set中的元素都是另一个中的元素(二者互为subset)。一个set比另一个set小,只有在第一个 set 是第二个setsubset时(是一个subset,但是并不相等)。一个 set 比另一个set打,只有在第一个 set 是第二个setsuperset时(是一个superset,但是并不相等)。
set和相等比较并不产生完整的排序功能。例如:任意两个sets都不相等也不互为子set,因此以下的运算都会返回Falsea<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,看看是否会报错。

猜你喜欢

转载自blog.csdn.net/df0128/article/details/83904084