那些Python集合中神秘的招式

浏览: 1208

                                        这是菜鸟学python的第17篇原创文章


阅读本文大概需要8分钟



Python有3大数据类型,列表,字典和集合,列表和字典前面我都讲过了,今天我们来聊聊Python中的集合.

Python的书里面完整全面讲集合的不多,即使有的也只是简单带过,笔墨不多。大部分介绍Python数据结构都是被列表,字典两大网红遮盖了锋芒.貌似集合在Python的世界里很冷门,其实集合里面的东西很有用,有它特定的适用的场景,特别是在数据处理的时候.大显身手.

那么说起集合,很多人一定想到了集合论里面集合,对的Python就是把这个概念引入的。Python中的集合有两种类型,可变集合和不可变集合.

1.集合介绍

集合与列表([])和字典({})不同,没有特别的语法格式.列表和字典可以分别用他们自己的工厂方法list()和dict()创建,集合只有一种方法也是唯一的方法-集合的工厂方法set()和frozenset():

  • set()

set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算.

  • frozenset()

rozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

下图列出所有集合里的操作符


1).集合赋值


细心的同学一定发现为啥少了几个字母,两个重复的o,三个重复的l,怎么都只出现了1个。对的,这是集合一个非常重要的概念

去重复,非常有用,特别是在去掉列表里面的重复元素的时候,一招搞定。真是一招鲜,吃遍天,列如:

print set(['a','c','c','z','y','a','b'])

>>set(['a', 'y', 'c', 'z', 'b'])#去掉了重复的元素

.

2).如何访问集合中的值

检查某个元素是不是在集合里面 #in 和not in


遍历查看集合成员#for

for element in s:
    print element


3).更新和删除

s.add('z')
print s
>>set(['e', 'd', 'H', 'l', 'o', 'r', 'W', 'z'])#多了个'z'
s.remove('W')
print s
>>set(['e', 'd', 'H', 'l', 'o', 'r', 'z'])#去掉了W


2.集合几大常见的操作招式

1)联和,合并

s=set('123')
print s
>>set(['1', '3', '2'])
t=set('345')
print t
>>set(['3', '5', '4'])
print s|t
>>set(['1', '3', '2', '5', '4'])//s和t并集是有所有s的元素和所有t的元素


2).交集//类似集合的合取操作

s=set('123')
print s
>>set(['1', '3', '2'])
t=set('345')
print t
>>set(['3', '5', '4'])
print s&t
>>set(['3'])


3).差补//相对补集

两个集合s和t的差补,表示新的集合只属于s,而不属于t

s=set('123')
print s
>>set(['1', '3', '2'])
t=set('345')
print t
>>set(['3', '5', '4'])
print s-t
>>set(['1', '2'])
print t-s
>>set(['5', '4'])

4).对称差分//类似集合中的异或

s=set('123')
print s
>>set(['1', '3', '2'])
t=set('345')
print t
>>set(['3', '5', '4'])
print s^t
>>set(['1', '2', '5', '4'])

结论:

说了这么多,举个小例子就知道集合的威力,比如我们有3个列表分别是2014,2015,2016的最佳学生,比如:

students_2014=['jack','james','lisa','leo','tom','wang','lee']
students_2015=['jane','james','sean','leo','wang','lari']
students_2016=['sam','max','larisa','Yan','leo','jack']

我们想知道谁是连续2014,2015最佳学生

print set(students_2014)&set(students_2015)
>>set(['james', 'wang', 'leo'])

我们想知道谁是连续2014,2015,2016最佳学生

print set(students_2014)&set(students_2015)&set(students_2016)
>>set(['leo'])

我们想知道谁2014是最佳学生,但是后两年没有好好学,没有进入2015,2016最佳名单

print set(students_2014)-set(students_2015)-set(students_2016)
>>set(['lisa', 'lee', 'tom'])

设想如果列表是1000个元素,用这招过滤是不是很爽.


好了集合里面的神秘招式就讲到这里啦(是不是写的太长了),希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.

最后说一下,原创不易,希望大家能够给点支持,欢迎转发,留言,也是对我的一点鼓励和动力.

也欢迎更多喜欢Python的同学关注 菜鸟学python,一起来学python吧 长按下方的二维码即可关注.


推荐 2
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册