CrazyWing:Python自动化运维开发实战 十二、Python数据类型之集合
2017-12-07 23:10
976 查看
导语:
集合就是数学里的集合,没有什么特殊的定义。集合最好的应用是去重。集合的表示方法是通过一个{}创建或者通过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的交集,并将结果放入s s.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的对称差集,并将结果放入s s.isdisjoint(t) 如果s和t没有相同项,则返回True s.issubset(t) 如果s是t的一个子集,则返回True s.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:Python自动化运维开发实战 七、Python数据类型之数字
- CrazyWing:Python自动化运维开发实战 十一、Python数据类型之字典
- CrazyWing:Python自动化运维开发实战 十、Python数据类型之元组
- CrazyWing:Python自动化运维开发实战 一、初识Python
- CrazyWing:Python自动化运维开发实战 二十一、html标签用法平推式
- CrazyWing:Python自动化运维开发实战 四、Python变量
- CrazyWing:Python自动化运维开发实战 十四、Python函数
- CrazyWing:Python自动化运维开发实战 十八、Python面向对象
- CrazyWing:Python自动化运维开发实战 十六、Python正则表达式
- CrazyWing:Python自动化运维开发实战 六、流程控制
- CrazyWing:Python自动化运维开发实战 九、Python数据类型之列表
- CrazyWing:Python自动化运维开发实战 十三、Python文件I/O
- CrazyWing:Python自动化运维开发实战 八、Python数据类型之字符串
- CrazyWing:Python自动化运维开发实战 五、Python运算符与表达式
- CrazyWing:Python自动化运维开发实战 二十、html标签用法起手式
- CrazyWing:Python自动化运维开发实战 三、python文件类型
- CrazyWing:Python自动化运维开发实战 二、Python基本用法
- CrazyWing:Python自动化运维开发实战 十九、html基础入门
- CrazyWing:Python自动化运维开发实战 十五、Python模块
- 8-Python3从入门到实战—基础之数据类型(集合-Sets)