【Python】set() 集合操作与运算 && 元素输出顺序

集合 | 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下,相同计算机上同次运行的输出结果相同,不同次运行的输出顺序通常不同

同一计算机上原生Python的不同次运行

IPython

IPython是一个基于Python Shell的交互式解释器,但有比默认Shell强大得多的编辑和交互功能
IPython下,由于经过了包装与美化,set/dict的屏幕输出默认会经过排序,因而每次运行的输出顺序都相同
然而由于set本身无序,不能对set取index,因而IPython中的按序输出除了看起来更舒服以外,并没有实质上的作用

同一计算机上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

  1. python基础学习——列表(list), 元祖(tuple), 字典(dict), 字符串(string), 集合(set) 介绍及相互转换
  2. Python 集合set()添加删除、交集、并集、集合操作详解
  3. How is set implemented internally in python?
  4. python 使用set对列表去重,并保持列表原来顺序

希望能够对大家有所帮助~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值