博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CrazyWing:Python自动化运维开发实战 十二、Python数据类型之集合
阅读量:6217 次
发布时间:2019-06-21

本文共 2337 字,大约阅读时间需要 7 分钟。

导语:

集合就是数学里的集合,没有什么特殊的定义。集合最好的应用是去重。

集合的表示方法是通过一个{}创建或者通过set和frozenset函数转换成集合。

有两个函数可创建集合类型对象:

set()   创建可变集合对象frozenset()  创建不可变集合对象

可变集合创建:

s = {
"tom","cat","name","error"}或s = set({
"tom","cat","name","error"})

不可变集合创建:

>>> s = [23,3,4,32]>>> d = frozenset(s)     //创建不可变集合d>>> print(d)>>> frozenset({23,3,4,32})

集合特性:

集合是一组无序排序的可哈希hash的值,不重复支持集合关系测试:支持成员关系测试:in , not in支持迭代不支持:索引、元素获取、切片没有特定语法格式,只能通过工厂函数set或者frozenset创建,字符串则直接创建即可。 集合中的元素必须是可迭代对象,所有元素不会重复,不像list列表是可以重复

注:可哈希什么意思?

hash是一种函数映射,称为hash函数,y=hash_func(x),可hash就是指对于一个对象x有其对应的y。在python内部是通过字典key的hash值来对应内存中的value地址的,所以两个相同hash的key就表示同一个了,而不可hash的对象自然也不能作为字典的key。

集合运算符:

s | t     s和t的并集s & t   s和t的交集s - t     求差集s ^ t   求对称差集  len(s)  集合中项数max(s)  最大值min(s)   最小值

适用于set可变集合常用方法:

s.add(item)        将item添加到s中。如果item已经在s中,则无任何效果s.remove(item)  从s中删除item。如果item不是s的成员,则引发KeyError异常s.discard(item)  从s中删除item。如果item不是s的成员,则无任何效果s.pop()       随机删除一个s中任意的集合元素,如果有变量接收则会接收到删除到的那个元素s.clear()     删除s中的所有元素s.copy()     浅复制s.update(t)将t中的所有元素添加到s中。t可以是另一个集合、一个序列或者支持迭代的任意对象s.union(t)                          求并集。返回所有在s和t中的元素s.intersection(t)                求交集。返回所有同时在s和t中的都有的元素s.intersection_update(t)   计算s与t的交集,并将结果放入ss.difference(t)                   求差集。返回所有在set中,但不在t中的元素s.difference_update(t)      从s中删除同时也在t中的所有元素s.symmetric_difference(t)  求对称差集。返回所有s中没有t中的元素和t中没有s中的元素组成的集合s.sysmmetric_difference_update(t) 计算s与t的对称差集,并将结果放入ss.isdisjoint(t)     如果s和t没有相同项,则返回Trues.issubset(t)      如果s是t的一个子集,则返回Trues.issuperset(t)   如果s是t的一个超集,则返回True

集合实例:祛除列表中重复的元素

例1:去除海量列表里重复元素

>>> a = [11,22,33,44,11,22] >>> b = set(a) >>> b set([33, 11, 44, 22])

例2:去除重复元素后转换成列表

l1 = ['b','c','d','b','c','a','a']l2 = list(set(l1))print l2

还有一种据说速度更快的,没测试过两者的速度差别

l1 = ['b','c','d','b','c','a','a']l2 = {}.fromkeys(l1).keys()print l2

这两种都有个缺点,祛除重复元素后排序变了:

['a', 'c', 'b', 'd']

如果想要保持他们原来的排序:

用list类的sort方法l1 = ['b','c','d','b','c','a','a']l2 = list(set(l1))l2.sort(key=l1.index)print l2

也可以这样写:

l1 = ['b','c','d','b','c','a','a']l2 = sorted(set(l1),key=l1.index)print l2

也可以用遍历:

l1 = ['b','c','d','b','c','a','a']l2 = []for i in l1:    if not i in l2:        l2.append(i)print l2

上面的代码也可以这样写

l1 = ['b','c','d','b','c','a','a']l2 = [][l2.append(i) for i in l1 if not i in l2]print l2

这样就可以保证排序不变了:

['b', 'c', 'd', 'a']         本文转自 CrazyWing 51CTO博客,原文链接:http://blog.51cto.com/fklinux/2048541

转载地址:http://slpja.baihongyu.com/

你可能感兴趣的文章
导航菜单 JSUI
查看>>
QT实现应用程序重启
查看>>
jade模板引擎学习笔记(WebsStorm9.0.3+ nodejs+express+jade)
查看>>
运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化
查看>>
C# 实体类序列化与反序列化一 (XmlSerializer)
查看>>
【解决】Listener refused the connection with the following error 错误解决
查看>>
Java UDP小结
查看>>
编译可在Android上运行的qemu user mode
查看>>
JDK自带XML和java对象相互转换
查看>>
【Go语言】【7】GO语言的切片
查看>>
postgres vacuum row is too big
查看>>
Tomcat 对 Cookie的聪明处理。
查看>>
巧用Linux 架设TFTP Server备份路由器的配置文件
查看>>
fatal: Not a git repository (or any of the parent directories):
查看>>
感悟总结
查看>>
C++多线程编程笔记
查看>>
Java Web 中 过滤器与拦截器的区别
查看>>
Linux进阶05:忘记root密码咋办
查看>>
《APUE》读书笔记—第九章进程关系
查看>>
工作小记(六)----学习方法
查看>>