集合 | SET
集合(set)是Python中一种重要的数据类型,表示一组各不相同元素的无序集合,其主要应用于重复元素消除及关系测试等
集合在Python内部通过哈希表实现,其本征无序,输出时所显示的顺序具有随机性,且与运行环境相关
操作与运算
主要包括基于不同对象的创建、元素级的运算及包含关系、集合间的运算及包含关系等
创建集合
- 列表:
a = [2, 3, 4, 2, 1]
set_a = set(a)
print (set_a)
输出:{1, 2, 3, 4}
重复的 2 只出现了一次
- 字符串:
b = 'sdgdfgeyoz'
set_b = set(b)
print (set_b)
输出:{‘f’, ‘e’, ‘z’, ‘o’, ‘d’, ‘s’, ‘y’, ‘g’}
重复的 ‘d’ 和 ‘g’ 都只出现了一次
元素运算
- 添加元素:
set_a.add(x) # 将元素x作为一个整体,添加到set_a中
set_b.update(x) # 将元素x执行set(x),拆分为个体,再添加到set_a中
- 删除元素:
set_a.remove(x) # 从set_a中删除元素x, 如果不存在则抛出KeyError
set_a.discard(x) # 如果在set_a中存在元素x, 则删除
set_a.pop() # 删除并且返回set_a中的一个不确定的元素, 如果set_a为空则抛出KeyError
set_a.clear() # 清除set_a中的所有元素
元素包含关系
x in set_x # x在set_x中?
y not in set_x # y不在set_x中?
输出返回 True 或 False
集合运算
- 求并集,包含set_a和set_b中的所有元素:
set_a | set_b
set_a.union(set_b)
set_a.update(set_b) # 自我更新不返回新对象,即set_a |= set_b
- 求交集,包含set_a和set_b中的共有元素:
set_a & set_b
set_a.intersection(set_b)
set_a.intersection_update(set_a) # 自我更新不返回新对象,即set_a &= set_b
- 求差集,包含set_a中有而set_b没有的元素:
set_a - set_b
set_a.difference(set_b)
set_a.difference_update(set_a) # 自我更新不返回新对象,即set_a -= set_b
- 求对称差集,包含set_a和set_b中不重复的所有元素:
set_a ^ set_b
set_a.symmetric_difference(set_b)
set_a.symmetric_difference_update(set_b) # 自我更新不返回新对象,即set_a ^= set_b
- 返回set_a的一个浅复制:
set_a.copy()
集合包含关系
set_a.issubset(set_b) # set_a是set_b的子集?
set_a.issuperset(set_b) # set_a是set_b的超集?
输出返回 True 或 False
元素输出顺序
集合在Python内部通过哈希表实现,其本征无序
打印输出的时候需要遍历哈希表的每一个bucket,这时候哪个bucket在前面,其对应的元素就排在前面
因此,在不同计算机上或在同一计算机上的不同次运行结果的输出顺序通常都会不一样
原生Python
原生Python下,相同计算机上同次运行的输出结果相同,不同次运行的输出顺序通常不同
IPython
IPython是一个基于Python Shell的交互式解释器,但有比默认Shell强大得多的编辑和交互功能
IPython下,由于经过了包装与美化,set/dict的屏幕输出默认会经过排序,因而每次运行的输出顺序都相同
然而由于set本身无序,不能对set取index,因而IPython中的按序输出除了看起来更舒服以外,并没有实质上的作用
列表去重排序
- 对列表去重,并排序:
set_a = set(list_a)
list_a_s = list(set_a)
list_a_s.sort()
- 对列表去重,并保持原有的顺序:
mail_to = ['cc', 'bbbb', 'afa', 'sss', 'bbbb', 'cc', 'shafa']
addr_to = list(set(mail_to))
addr_to.sort(key = mail_to.index)
输出addr_to为:[‘cc’, ‘bbbb’, ‘afa’, ‘sss’, ‘shafa’]
References
- python基础学习——列表(list), 元祖(tuple), 字典(dict), 字符串(string), 集合(set) 介绍及相互转换
- Python 集合set()添加删除、交集、并集、集合操作详解
- How is set implemented internally in python?
- python 使用set对列表去重,并保持列表原来顺序
希望能够对大家有所帮助~