欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 集合之set详解

程序员文章站 2022-03-24 08:12:51
目录引言set(集合)虽然用的很少,但它是一个无序的不重复元素序列,用来简单的去重挺快的。集合的定义set(集合) 与列表类似,不同之处在于集合的 元素不重复集合和字典一样也是用 {} 定义,但元素之...

引言

set(集合)虽然用的很少,但它是一个无序的不重复元素序列,用来简单的去重挺快的。

集合的定义

set(集合) 与列表类似,不同之处在于集合的 元素不重复
集合和字典一样也是用 {} 定义,但元素之间使用 , 分隔,或者使用 set()

{ } 定义

#!/usr/bin/python3
# -*- coding:utf-8 -*-
name_set = {'hui', 'wang', 'zack', 'hui'}
print(name_set)    	# 结果为 {'hui', 'wang', 'zack'}
name_set = set('hui', 'wang', 'zack', 'hui')

set() 定义

set() 只接受一个参数

in [13]: name_set = set('hui')
in [14]: name_set
out[14]: {'h', 'i', 'u'}
in [15]: name_set = set(['hui', 'wang', 'zack', 'hui'])
in [16]: name_set
out[16]: {'hui', 'wang', 'zack'}

注意:空集合不能用 s = {} 来定义这样默认是字典,应该 s = set()

in [27]: s = {}
in [28]: s1 = set()
in [29]: type(s)
out[29]: dict
in [30]: type(s1)
out[30]: set

集合常用操作

集合所有内置方法如下:

Python 集合之set详解

方法太多我选几个常用的测试一下。

集合添加元素

使用 add() 即可向集合中添加元素

in [33]: s = set()
in [34]: s.add(1)
in [35]: s.add(4)
in [36]: s.add(3)
in [37]: s
out[37]: {1, 3, 4}
in [38]: s.add(2)
in [39]: s
out[39]: {1, 2, 3, 4}

集合移除元素

  • remove() 移除集合中的元素,且如果元素不存在,会报错
  • discard() 移除集合中的元素,且如果元素不存在,不会发生错误
  • pop() 随机移除集合内的一个元素
in [38]: # remove() 移除
in [39]: s
out[39]: {1, 2, 3, 4}
in [40]: s.remove(3)
in [41]: s
out[41]: {1, 2, 4}
in [42]: s.remove(5)
---------------------------------------------------------------------------
keyerror                                  traceback (most recent call last)
<ipython-input-42-9ec04578636f> in <module>
----> 1 s.remove(5)
keyerror: 5
in [45]: # discard() 移除
in [46]: s
out[46]: {1, 2, 4}
in [47]: s.discard(4)
in [48]: s
out[48]: {1, 2}
in [49]: s.discard(3)
in [50]: s
out[50]: {1, 2}
in [56]: # pop() 随机移除
in [57]: s.pop()
out[57]: 1
in [58]: s
out[58]: {2, 3, 9, 'hui'}
in [59]: s.pop()
out[59]: 2
in [60]: s
out[60]: {3, 9, 'hui'}

其实set 集合的 pop方法会将集合的左边第一个元素进行删除,并返回删除的元素。

集合统计、清空元素

  • len() 统计集合元素个数
  • clear() 清空集合
in [68]: name_set
out[68]: {'wang', 'zack'}
in [69]: len(name_set)
out[69]: 2
in [71]: name_set.clear()
in [72]: len(name_set)
out[72]: 0
in [73]: name_set
out[73]: set()

集合元素获取(遍历)

集合不支持索引,也没有方法进行获取,因此只能采用 for ... in ... 遍历方式获取元素。

in [81]: name_set
out[81]: {'hui', 'wang', 'zack'}
in [82]: for name in name_set:
    ...:     print(name)
    ...:
hui
wang
zack
in [83]: name_set[0]
---------------------------------------------------------------------------
typeerror                                 traceback (most recent call last)
<ipython-input-83-c0ead6d21f1d> in <module>
----> 1 name_set[0]
typeerror: 'set' object is not subscriptable

集合之间的运算

集合差运算 -

in [89]: a = {1, 2, 3, 4, 5}
in [90]: b = {1, 2, 3, 6}
in [91]: a - b
out[91]: {4, 5}
in [92]: b - a
out[92]: {6}
in [93]: a.difference(b)
out[93]: {4, 5}
in [94]: b.difference(a)
out[94]: {6} 

a - b 就相当于在 a 中去除跟 b 相同的元素b - a 也就是在 b 中去除跟 a 相同的元素a - b 等同于 a.difference(b)

集合并运算 |

in [95]: a
out[95]: {1, 2, 3, 4, 5}
in [96]: b
out[96]: {1, 2, 3, 6}
in [97]: a | b
out[97]: {1, 2, 3, 4, 5, 6}

集合交运算 &

in [99]: a
out[99]: {1, 2, 3, 4, 5}
in [100]: b
out[100]: {1, 2, 3, 6}
in [101]: a & b
out[101]: {1, 2, 3}

集合异或运算 ^

in [102]: a
out[102]: {1, 2, 3, 4, 5}
in [103]: b
out[103]: {1, 2, 3, 6}
in [104]: a ^ b
out[104]: {4, 5, 6}

把 a, b 集合中的相同元素都去掉,剩下的就是 ^ 异或运算的结果。

应用场景

普通for循环去重

in [1]: li = [2, 1, 3, 6, 2, 1]
in [2]: temp = []
in [3]: for i in li:
   ...:     if i not in temp:
   ...:         temp.append(i)
   ...:
in [4]: li
out[4]: [2, 1, 3, 6, 2, 1]
in [5]: temp
out[5]: [2, 1, 3, 6]

利用集合简单去重

in [106]: li = [1, 2, 2, 3, 3, 5]
in [107]: li = set(li)
in [108]: li
out[108]: {1, 2, 3, 5}
in [109]: type(li)
out[109]: set
in [110]:

这样把原来的列表类型变成了集合类型,这样更不好操作,这样不是想要的结果。

因此要做到 去重加类型不变,只要再嵌套一个list() 即可

in [110]: li = [1, 2, 2, 3, 3, 5]
in [111]: li = list(set(li))
in [112]: li
out[112]: [1, 2, 3, 5]
in [113]: type(li)
out[113]: list
in [114]:

去重保持原来的顺序

使用 sort + set 去重

in [6]: list1 = [2, 1, 3, 6, 2, 1]
in [7]: list2 = list(set(list1))
in [8]: list2
out[8]: [1, 2, 3, 6]
in [9]: list2.sort(key=list1.index)
in [10]: list2
out[10]: [2, 1, 3, 6]

使用 sorted + set 去重

in [12]: list1 = [2, 1, 3, 6, 2, 1]
in [13]: temp = sorted(set(list1), key=list1.index)
in [14]: temp
out[14]: [2, 1, 3, 6]

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

相关标签: Python set 集合