Python 集合 — set

简介: Python 集合 — set

引言

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

<br/>

集合的定义

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

<br/>

{ } 定义

#!/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')

<br/>

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'}

<br/>

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

In [27]: s = {}

In [28]: s1 = set()

In [29]: type(s)
Out[29]: dict

In [30]: type(s1)
Out[30]: set

<br/>

集合常用操作

集合所有内置方法如下:

集合内置方法

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

<br/>

集合添加元素

使用 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}

<br/>

集合移除元素

  • remove() 移除集合中的元素,且如果元素不存在,会报错
  • discard() 移除集合中的元素,且如果元素不存在,不会发生错误
  • pop() 随机移除集合内的一个元素

<br/>

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

<br/>

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}

<br/>

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'}

<br/>

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

<br/>

集合统计、清空元素

  • len() 统计集合元素个数
  • clear() 清空集合

<br/>

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 ... 遍历方式获取元素。

<br/>


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

<br/>

集合之间的运算

集合差运算 -

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} 
   

<br/>

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

<br/>

集合并运算 |

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}

<br/>

集合交运算 &

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}

<br/>

集合异或运算 ^

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 集合中的相同元素都去掉,剩下的就是 ^ 异或运算的结果。

<br/>

应用场景

普通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]

<br/>

利用集合简单去重

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]:

<br/>

去重保持原来的顺序

使用 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]

<br/>

使用 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]

<br/>

尾语

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

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

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

021.png

相关文章
|
10天前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
101 2
|
11月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
368 1
思科设备巡检命令Python脚本大集合
|
5月前
|
存储 缓存 安全
Python frozenset 集合详解:不可变集合的终极指南
frozenset是Python中一个常被忽视但极具价值的不可变集合类型。本文深入解析其本质、操作方法与应用场景,揭示其通过不可变性带来的安全性与性能优势。从底层实现到实战案例,涵盖字典键使用、缓存优化及类型注解等高级场景。同时对比性能数据,提供最佳实践指南,并展望Python 3.11+中的优化。掌握frozenset,可为代码带来更强健性与效率,适合多种特定需求场景。
221 5
|
11月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
144 6
|
11月前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
119 5
|
11月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
117 2
|
11月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
120 3
|
6月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。
|
10月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
4287 113
|
10月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
595 113