首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python基础教程:set(集合)

python基础教程:set(集合)

作者头像
一墨编程学习
发布2019-05-15 11:43:51
6880
发布2019-05-15 11:43:51
举报

Python集合(set),是一个很有意思的数据结构。从形式上看,它像字典有key但没有value,它的写法是这样的s = {'a', 'b', 'c'},是不是像一个没有value的字典?另一方面,它又像是一个用花括号替换了方括号的列表,但它不能像列表那样用索引访问元素。

其实,Python集合在内部实现上就是一个没有value的字典,所以它跟字典很像。既然和字典很像,那么还要集合干什么?集合主要用来干什么呢?

集合主要用于测试一个对象是不是在一堆对象集里面,也就是in运算。这个功能其实列表也可以,比如1 in [2,3,4,5],但是用列表的速度远远低于集合,尤其是在这一堆对象的数量非常大时。

列表因为是顺序存储的,它的查找时间复杂度是O(n),而集合是用hash table实现的,其时间复杂度是O(1)

python集合

Python集合(set)的创建

集合可以通过set()来创建一个空集合,也可以把一个列表转换为集合。类似字典那样在花括号内可以放用逗号,隔开的多个对象:

In [1]: s = set()

In [2]: type(s)
Out[2]: set

In [3]: set([1,2,3,4,5])
Out[3]: {1, 2, 3, 4, 5}

In [4]: set([1,2,3,3,5])
Out[4]: {1, 2, 3, 5}

In [5]: s = {'a', 'd', 'e', 'c', 'b'}

In [6]: s2 = {1, 'a', True} 

In [7]: s = {'a', 'a', 'a'}

In [8]: s
Out[8]: {'a'}  # 字典里面的元素不能重复

跟字典的键不能是可变对象一样,集合里面也不能是列表、集合、字典:

In [9]: s = {'a', [1,2]}
------------------------
TypeError        Traceback (most recent call last)
<ipython-input-9-0a9fe58d273d> in <module>
----> 1 s = {'a', [1,2]}

TypeError: unhashable type: 'list'

In [10]: s = {'a', {'a':1}}
---------------------------
TypeError           Traceback (most recent call last)
<ipython-input-10-f0b724762652> in <module>
----> 1 s = {'a', {'a':1}}

TypeError: unhashable type: 'dict'

Python集合(set)的访问

集合不能像列表那样通过索引访问内部某一个元素,只能通过遍历访问全部元素,或通过变量名访问整个集合:

In [13]: s = {'a', 'b', 'c'}

In [14]: s
Out[14]: {'a', 'b', 'c'}

In [15]: for x in s: 
    ...:     print(x) 
    ...:
a
c
b

集合相关的内置函数

Python内置了一些函数可以用于操作集合,它们是:

  1. len() 返回集合的长度,即集合包含的元素的个数。空集合的长度是0
In [41]: len({'a', 'b'})
Out[41]: 2

In [42]: len(set())
Out[42]: 0
  1. any()和all() 类似于对列表、tuple的操作。 any(): 只要集合有一个元素为True则返回True; all(): 只有集合的所有元素都为True才返回True;
In [45]: any({'', 0, False})
Out[45]: False

In [46]: all({'', 0, False})
Out[46]: False

In [47]: all({'a', 0:, False})
Out[47]: False

In [48]: any({'a', 0:, False})
Out[48]: True

In [49]: any(set())
Out[49]: False

In [50]: all(set())
Out[50]: True

跟空字典一样,它却认为是所有元素都为True,all(set())返回True。

  1. sorted() 跟操作列表、tuple的效果一样,它把集合的所有元素进行排序
In [51]: sorted({'a', 'c', 'b'})
Out[51]: ['a', 'b', 'c']

in 运算符

跟列表,元组一样,in用来检验一个对象是不是在集合中:

In [56]: 'a' in {'a', 'c', 'b'}
Out[56]: True

In [57]: '3' in {'a', 'c', 'b'}
Out[57]: False

In [58]: '3' not in {'a', 'c', 'b'}
Out[58]: True

遍历集合:

In [59]: for k in {'a', 'c', 'b'}: 
    ...:     print(key) 
    ...:
a
c
b

集合的内置方法:

(1)add(x) 把对象x添加到集合中。

In [25]: s = {'a', 'b', 'c'}

In [26]: s.add(1)

In [27]: s
Out[27]: {1, 'a', 'b', 'c'}

(2)update() 把多个对象添加到集合中。

In [28]: s.update([1,2,3])

In [29]: s
Out[29]: {1, 2, 3, 'a', 'b', 'c'}

In [30]: s.update(['x', 'y'], {7,8,0})

In [31]: s
Out[31]: {0, 1, 2, 3, 7, 8, 'a', 'b', 'c', 'x', 'y'}

(3)discard(x) 和 remove(x) 这两个都是从集合中删除一个元素x。不同的是,如果x不在集合中,discard()会忽略;而remove()会抛出KeyError的错误:

In [32]: s
Out[32]: {0, 1, 2, 3, 7, 8, 'a', 'b', 'c', 'x', 'y'}

In [33]: s.discard(0)

In [34]: s.remove(1)

In [35]: s
Out[35]: {2, 3, 7, 8, 'a', 'b', 'c', 'x', 'y'}

In [36]: s.discard('z')

In [37]: s.remove('z')
----------------------
KeyError              Traceback (most recent call last)
<ipython-input-37-a9e7a977e50c> in <module>
----> 1 s.remove('z')

KeyError: 'z'

(4)pop() 类似字典的pop()和列表的pop(),都是从其中删除一个元素并返回该元素。因为集合没有key和索引的概念,所以集合的pop()不带参数。

(5)clear() 清空一个集合

In [40]: s
Out[40]: {2, 3, 7, 8, 'a', 'b', 'c', 'x', 'y'}

In [41]: s.clear()

In [42]: s
Out[42]: set()

(6)copy() 跟字典的copy()一样,返回一个集合的深拷贝。

In [44]: s = {'a', 'b', 'c'}

In [45]: s2 = s.copy()

In [46]: s2
Out[46]: {'a', 'b', 'c'}

In [47]: s.add(1)

In [48]: s
Out[48]: {1, 'a', 'b', 'c'}

In [49]: s2
Out[49]: {'a', 'b', 'c'}

(7)union() 求两个或多个集合的并集,即把这些集合的所有元素放在一起组成新的集合并返回。它不改变原来的集合。

In [51]: s1, s2, s3 = {1,2,3}, {4,5,6}, {6,7,8}

In [52]: s1.union(s2)
Out[52]: {1, 2, 3, 4, 5, 6}

In [53]: s1
Out[53]: {1, 2, 3}

In [54]: s1.union(s2, s3)
Out[54]: {1, 2, 3, 4, 5, 6, 7, 8}

(8)intersection() 求两个或多个集合的交集,即把这些集合中共同含有的元素放在一起组合成新的集合并返回。同样它也不改变原来的集合。

In [55]: s1.intersection(s2)
Out[55]: set()

In [56]: s2.intersection(s3)
Out[56]: {6}

In [57]: s1.intersection(s2, s3)
Out[57]: set()

(10)difference() 求一个集合S与另一个或多个集合的差集,即把只包含在集合S却不在做比较的集合中的元素组成新的集合并返回,同样它也不改变原来的集合。相当于集合的减法。

In [58]: s1.difference(s2)
Out[58]: {1, 2, 3} # 返回s1包含却不在s2中的元素组成的集合: s1 - s2

In [59]: s2.difference(s1)
Out[59]: {4, 5, 6} # s2包含,s1不包含: s2 - s1

In [60]: s2.difference(s3)
Out[60]: {4, 5}  # s2包含,s3不包含: s2 - s3

In [61]: s2.difference(s3, s1)
Out[61]: {4, 5} # s2包含,s3,s1都不包含: s2 - s3 - s1

(11)symmetric_difference() 求两个集合中除去交集之外的元素集合,即把不同时包含在两个集合中的元素放在一起组成新的集合并返回。

In [63]: s1, s2, s3
Out[63]: ({1, 2, 3}, {4, 5, 6}, {6, 7, 8})

In [64]: s1.symmetric_difference(s2)
Out[64]: {1, 2, 3, 4, 5, 6}

In [65]: s2.symmetric_difference(s3)
Out[65]: {4, 5, 7, 8}

(12) intersection_update() 同intersection()一样求得新集合,但是本方法改变调用它的对象。

In [74]: s1, s2, s3 = {1,2,3}, {4,5,6}, {6,7,8}

In [75]: s1.intersection(s2)
Out[75]: set()

In [76]: s1
Out[76]: {1, 2, 3}

In [77]: s1.intersection_update(s2)

In [78]: s1
Out[78]: set()

(13)difference_update() 同difference()一样求得新集合,并用新集合改变调用该方法的集合。

In [79]: s1, s2, s3 = {1,2,3}, {4,5,6}, {6,7,8}

In [80]: s1.difference_update(s2)

In [81]: s1
Out[81]: {1, 2, 3}

(14)symmetric_difference_update() 通symmetric_difference()一样求得新集合,并用新集合改变调用该方法的集合。

In [83]: s1, s2 = {1,2,3}, {4,5,6}

In [84]: s1.symmetric_difference_update(s2)

In [85]: s1
Out[85]: {1, 2, 3, 4, 5, 6}

(15)isdisjoint() 如果两个集合没有交集则返回True。

In [87]: s1, s2 = {1,2,3}, {4,5,6}

In [88]: s1.isdisjoint(s2)
Out[88]: True

(16)issubset() 判断一个集合是不是另一个集合的子集,即它的所有元素都包含在另外一个集合中。

In [89]: {1,2}.issubset({1,2,3})
Out[89]: True

In [90]: {1,2}.issubset({1,2})
Out[90]: True

In [91]: {1,2}.issubset({1,5,6})
Out[91]: False

(17)issuperset() 判断一个集合是不是另一个集合的超集,即它包含另外一个集合的所有元素。

In [93]: {1,2}.issuperset({1,2})
Out[93]: True

In [94]: {1,2}.issuperset({1,2,3})
Out[94]: False

In [95]: {1,2}.issuperset({1})
Out[95]: True

frozenset

顾名思义,就是冻住了的集合,即不可改变的集合。集合不能作为字典的key,但是frozenset却可以。

In [100]: fs1 = frozenset()

In [101]: fs1
Out[101]: frozenset()

In [102]: fs2 = frozenset([1,2,3])

In [103]: fs2
Out[103]: frozenset({1, 2, 3})

In [104]: {fs2:3}
Out[104]: {frozenset({1, 2, 3}): 3}

总结

集合是没有了value的字典,但它也有自己的个性。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python集合(set)的创建
  • Python集合(set)的访问
  • 集合相关的内置函数
  • in 运算符
  • 集合的内置方法:
  • frozenset
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档