Python 集合 — set

╰半夏微凉° 2022-09-11 14:17 289阅读 0赞

引言

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

集合的定义

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

{ } 定义

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

set() 定义

set() 只接受一个参数

  1. In [13]: name_set = set('hui')
  2. In [14]: name_set
  3. Out[14]: { 'h', 'i', 'u'}
  4. In [15]: name_set = set(['hui', 'wang', 'zack', 'hui'])
  5. In [16]: name_set
  6. Out[16]: { 'hui', 'wang', 'zack'}

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

  1. In [27]: s = { }
  2. In [28]: s1 = set()
  3. In [29]: type(s)
  4. Out[29]: dict
  5. In [30]: type(s1)
  6. Out[30]: set

集合常用操作

集合所有内置方法如下:

集合内置方法

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

集合添加元素

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

  1. In [33]: s = set()
  2. In [34]: s.add(1)
  3. In [35]: s.add(4)
  4. In [36]: s.add(3)
  5. In [37]: s
  6. Out[37]: { 1, 3, 4}
  7. In [38]: s.add(2)
  8. In [39]: s
  9. Out[39]: { 1, 2, 3, 4}

集合移除元素

  • remove() 移除集合中的元素,且如果元素不存在,会报错
  • discard() 移除集合中的元素,且如果元素不存在,不会发生错误
  • pop() 随机移除集合内的一个元素
  1. In [38]: # remove() 移除
  2. In [39]: s
  3. Out[39]: { 1, 2, 3, 4}
  4. In [40]: s.remove(3)
  5. In [41]: s
  6. Out[41]: { 1, 2, 4}
  7. In [42]: s.remove(5)
  8. ---------------------------------------------------------------------------
  9. KeyError Traceback (most recent call last)
  10. <ipython-input-42-9ec04578636f> in <module>
  11. ----> 1 s.remove(5)
  12. KeyError: 5
  13. In [45]: # discard() 移除
  14. In [46]: s
  15. Out[46]: { 1, 2, 4}
  16. In [47]: s.discard(4)
  17. In [48]: s
  18. Out[48]: { 1, 2}
  19. In [49]: s.discard(3)
  20. In [50]: s
  21. Out[50]: { 1, 2}
  22. In [56]: # pop() 随机移除
  23. In [57]: s.pop()
  24. Out[57]: 1
  25. In [58]: s
  26. Out[58]: { 2, 3, 9, 'hui'}
  27. In [59]: s.pop()
  28. Out[59]: 2
  29. In [60]: s
  30. Out[60]: { 3, 9, 'hui'}

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

集合统计、清空元素

  • len() 统计集合元素个数
  • clear() 清空集合
  1. In [68]: name_set
  2. Out[68]: { 'wang', 'zack'}
  3. In [69]: len(name_set)
  4. Out[69]: 2
  5. In [71]: name_set.clear()
  6. In [72]: len(name_set)
  7. Out[72]: 0
  8. In [73]: name_set
  9. Out[73]: set()

集合元素获取(遍历)

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

  1. In [81]: name_set
  2. Out[81]: { 'hui', 'wang', 'zack'}
  3. In [82]: for name in name_set:
  4. ...: print(name)
  5. ...:
  6. hui
  7. wang
  8. zack
  9. In [83]: name_set[0]
  10. ---------------------------------------------------------------------------
  11. TypeError Traceback (most recent call last)
  12. <ipython-input-83-c0ead6d21f1d> in <module>
  13. ----> 1 name_set[0]
  14. TypeError: 'set' object is not subscriptable

集合之间的运算

集合差运算 -

  1. In [89]: a = { 1, 2, 3, 4, 5}
  2. In [90]: b = { 1, 2, 3, 6}
  3. In [91]: a - b
  4. Out[91]: { 4, 5}
  5. In [92]: b - a
  6. Out[92]: { 6}
  7. In [93]: a.difference(b)
  8. Out[93]: { 4, 5}
  9. In [94]: b.difference(a)
  10. Out[94]: { 6}
  • a - b 就相当于在 a 中去除跟 b 相同的元素
  • b - a 也就是在 b 中去除跟 a 相同的元素
  • a - b 等同于 a.difference(b)

集合并运算 |

  1. In [95]: a
  2. Out[95]: { 1, 2, 3, 4, 5}
  3. In [96]: b
  4. Out[96]: { 1, 2, 3, 6}
  5. In [97]: a | b
  6. Out[97]: { 1, 2, 3, 4, 5, 6}

集合交运算 &

  1. In [99]: a
  2. Out[99]: { 1, 2, 3, 4, 5}
  3. In [100]: b
  4. Out[100]: { 1, 2, 3, 6}
  5. In [101]: a & b
  6. Out[101]: { 1, 2, 3}

集合异或运算 ^

  1. In [102]: a
  2. Out[102]: { 1, 2, 3, 4, 5}
  3. In [103]: b
  4. Out[103]: { 1, 2, 3, 6}
  5. In [104]: a ^ b
  6. Out[104]: { 4, 5, 6}

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

应用场景

普通for循环去重

  1. In [1]: li = [2, 1, 3, 6, 2, 1]
  2. In [2]: temp = []
  3. In [3]: for i in li:
  4. ...: if i not in temp:
  5. ...: temp.append(i)
  6. ...:
  7. In [4]: li
  8. Out[4]: [2, 1, 3, 6, 2, 1]
  9. In [5]: temp
  10. Out[5]: [2, 1, 3, 6]

利用集合简单去重

  1. In [106]: li = [1, 2, 2, 3, 3, 5]
  2. In [107]: li = set(li)
  3. In [108]: li
  4. Out[108]: { 1, 2, 3, 5}
  5. In [109]: type(li)
  6. Out[109]: set
  7. In [110]:

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

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

  1. In [110]: li = [1, 2, 2, 3, 3, 5]
  2. In [111]: li = list(set(li))
  3. In [112]: li
  4. Out[112]: [1, 2, 3, 5]
  5. In [113]: type(li)
  6. Out[113]: list
  7. In [114]:

去重保持原来的顺序

使用 sort + set 去重

  1. In [6]: list1 = [2, 1, 3, 6, 2, 1]
  2. In [7]: list2 = list(set(list1))
  3. In [8]: list2
  4. Out[8]: [1, 2, 3, 6]
  5. In [9]: list2.sort(key=list1.index)
  6. In [10]: list2
  7. Out[10]: [2, 1, 3, 6]

使用 sorted + set 去重

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

尾语

✍ 用 Code 谱写世界,让生活更有趣。❤️

✍ 万水千山总是情,点赞再走行不行。❤️

✍ 码字不易,还望各位大侠多多支持。❤️

021.png

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python set集合(数据结构)

    `set`(集合)是一个非常有用的数据结构。它与列表(`list`)的行为类似,区别在于`set`不能包含重复的值。 这在很多情况下非常有用。例如你可能想检查列表中是否包含

    相关 Python基础】之集合set()

    集合用\{\}包含元素,但是不能用\{\}初始化集合,因为用\{\}初始化一个变量,默认是字典,集合是一个不重复且无序的元素集 集合的常用功能: set():初始