Python集合(set),是一个很有意思的数据结构。从形式上看,它像字典有key但没有value,它的写法是这样的s = {'a', 'b', 'c'},是不是像一个没有value的字典?另一方面,它又像是一个用花括号替换了方括号的列表,但它不能像列表那样用索引访问元素。
集合最常用的特性是元素不能重复,所以常用于去重。
1 li=[1,2,3,4,5,1,2,3] 2 li=list(set(li)) 3 print(li) li=[1,2,3,4,5]其实,Python集合在内部实现上就是一个没有value的字典,所以它跟字典很像。既然和字典很像,那么还要集合干什么?集合主要用来干什么呢?
集合主要用于测试一个对象是不是在一堆对象集里面,也就是in运算。这个功能其实列表也可以,比如1 in [2,3,4,5],但是用列表的速度远远低于集合,尤其是在这一堆对象的数量非常大时。
列表因为是顺序存储的,它的查找时间复杂度是O(n),而集合是用hash table实现的,其时间复杂度是O(1)。
Python集合(set)的创建
集合可以通过set()来创建一个空集合,也可以把一个列表转换为集合。类似字典那样在花括号内可以放用逗号,隔开的多个对象:
跟字典的键不能是可变对象一样,集合里面也不能是列表、集合、字典:
Python集合(set)的访问
集合不能像列表那样通过索引访问内部某一个元素,只能通过遍历访问全部元素,或通过变量名访问整个集合:
集合相关的内置函数
Python内置了一些函数可以用于操作集合,它们是:
- len()
- 返回集合的长度,即集合包含的元素的个数。空集合的长度是0
- any()和all()
- 类似于对列表、tuple的操作。
- any(): 只要集合有一个元素为True则返回True;
- all(): 只有集合的所有元素都为True才返回True;
跟空字典一样,它却认为是所有元素都为True,all(set())返回True。
- sorted()
- 跟操作列表、tuple的效果一样,它把集合的所有元素进行排序
in 运算符
跟列表,元组一样,in用来检验一个对象是不是在集合中:
集合的内置方法:
(1)add(x)
把对象x添加到集合中。
(2)update()
把多个对象添加到集合中。
(3)discard(x) 和 remove(x)
这两个都是从集合中删除一个元素x。不同的是,如果x不在集合中,discard()会忽略;而remove()会抛出KeyError的错误:
(4)pop()
类似字典的pop()和列表的pop(),都是从其中删除一个元素并返回该元素。因为集合没有key和索引的概念,所以集合的pop()不带参数。
(5)clear()
清空一个集合
(6)copy()
跟字典的copy()一样,返回一个集合的深拷贝。
(7)union()
求两个或多个集合的并集,即把这些集合的所有元素放在一起组成新的集合并返回。它不改变原来的集合。
(8)intersection()
求两个或多个集合的交集,即把这些集合中共同含有的元素放在一起组合成新的集合并返回。同样它也不改变原来的集合。
(10)difference()
求一个集合S与另一个或多个集合的差集,即把只包含在集合S却不在做比较的集合中的元素组成新的集合并返回,同样它也不改变原来的集合。相当于集合的减法。
总结
集合是没有了value的字典,但它也有自己的个性。
练习
- 熟悉对集合的各种操作。
- 想一想集合可以和日常生活中哪些场景联系起来。
如果你觉得本文对你的学习有帮助的话,不妨点个赞呗。