Python 中的 Set (集合) 是什么?
在 Python 中,Set(集合) 是一种-无序-不重复的数据结构。-它类似于数学中的集合,用于存储唯一的值。-可以同时储存不同资料型态
集合的主要特点是:
-无序:Set 中的每个元素没有特定的顺序,这意味着不能通过索引(像列表那样)来访问元素。-唯一性:Set 中的每个元素都是唯一的,重复的值会自动被过滤掉。-可变:Set 本身是可变的,可以增加或删除元素,但 Set 中的元素必须是不可变的(如整数、字串、元组等)。
如何创建 Set
empty_set = set()
print(empty_set) # Output: set()
# 创建一个 Set,并自动去除重复元素
my_set = {1, 2, 3, 4, 5, 5}
print(my_set) # Output: {1, 2, 3, 4, 5}
#可以同时储存不同资料型态
multipleType ={ 2,\'apple\',False}
所以一定要用set()来建立集合?不一定要先用 set() 来创建一个集合。你可以直接使用大括号 {} 来创建一个集合并初始化其元素。但是,如果你想创建空集合,就必须使用 set(),因为 {} 会被解释为空字典。这是唯一的情况需要用到 set() 函数来明确创建集合。
# 创建空集合,必须用 set()
empty_set = set()
print(empty_set) # Output: set()
# 注意:如果你用 {} 创建,会得到空字典
empty_dict = {}
print(type(empty_dict)) # Output: <class \'dict\'>
所以只有当你需要创建空集合时,才必须使用 set()。其他情况下,直接使用 {} 并填入元素即可。
- expression: 要添加到集合中的元素。
- item: 迭代变量。
- iterable: 可迭代对象。
- condition: 可选的过滤条件。
# 创建一个包含 1 到 10 的平方数的集合
squares = {x**2 for x in range(10)}
print(squares) # 输出:{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# 创建一个包含字符串 \'hello\' 中所有唯一字母的集合
unique_letters = {char for char in \'hello\'}
print(unique_letters) # 输出:{\'h\', \'e\', \'l\', \'o\'}
# 创建一个包含 1 到 20 之间所有偶数的集合
even_numbers = {x for x in range(20) if x % 2 == 0}
print(even_numbers) # 输出:{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
集合推导式与列表推导式的差别
- 元素唯一性: 集合中的元素是唯一的,因此集合推导式会自动移除重复元素。
- 无序性: 集合是无序的,集合推导式的结果元素顺序可能与原始可迭代对象的顺序不同。
为什么要使用集合推导式?
- 快速建立集合: 可以有效率地建立集合,特别是从其他可迭代对像中提取唯一元素。
- 简洁的语法: 比传统的 for 循环方式更简洁。
- 可读性高: 对于简单的操作,集合推导式具有较高的可读性。
应用场景
- 去除重复元素: 从列表或其他可迭代物件中快速移除重复元素。
- 建立集合: 根据条件快速建立包含特定元素的集合。
- 集合运算: 可以结合其他集合运算子(如交集、并集、差集)进行更复杂的集合运算。
可以将多种可迭代物件转换为集合(set),常见的有:
-列表 (list)-元组 (tuple)-字串 (string)-字典 (dictionary)(只会取字典的键)-集合 (set) 本身(这是拷贝的方式)-范围 (range)
列表 (list) | [\'apple\', \'banana\', \'orange\'] | set([\'apple\', \'banana\', \'orange\']) | {\'apple\', \'banana\', \'orange\'} |
元组 (tuple) | (\'apple\', \'banana\', \'orange\') | set((\'apple\', \'banana\', \'orange\')) | {\'apple\', \'banana\', \'orange\'} |
字串 (string) | "apple" | set("apple") | {\'a\', \'e\', \'p\', \'l\'} |
字典 (dictionary) | {\'apple\': 1, \'banana\': 2, \'orange\': 3} | set({\'apple\': 1, \'banana\': 2, \'orange\': 3}) | {\'apple\', \'banana\', \'orange\'} |
集合 (set) | {\'apple\', \'banana\', \'orange\'} | set({\'apple\', \'banana\', \'orange\'}) | {\'apple\', \'banana\', \'orange\'} |
范围 (range) | range(1, 5) | set(range(1, 5)) | {1, 2, 3, 4} |
常用 Set 操作
my_set ={1,2,3}
add() | 将一个元素添加到集合中 | my_set.add(6)->{1,2,3,6} |
remove() | 从集合中移除指定元素,若元素不存在则报错 | my_set.remove(3)-> {1,2,6} |
discard() | 从集合中移除指定元素,若元素不存在则不报错 | my_set.discard(10) |
clear() | 移除集合中的所有元素 | my_set.clear()->{} |
in | 检查某个元素是否存在于集合中 | my_set = {1,2,3,4} print(3 in my_set )→ True |
not in | 检查某个元素没有存在于集合中 | my_set = {1,2,3,4} print(4 in my_set )→ false |
len(iterable) | 返回可迭代对象的元素个数。 | len({1, 2, 3, 4, 5}) 返回 5 |
sum(iterable, start=0) | 返回可迭代对象中所有元素的总和,start 为可选参数,表示总和的起始值(默认为 0)。 | sum({1, 2, 3, 4, 5}) 返回 15 |
max(iterable, *[, key]) | 返回可迭代对象中的最大值,key 为可选参数,用于指定自定义的比较函数。 | max({1, 2, 3, 4, 5}) 返回 5 |
min(iterable, *[, key]) | 返回可迭代对象中的最小值,key 为可选参数,用于指定自定义的比较函数。 | min({1, 2, 3, 4, 5}) 返回 1 |
解析 max(iterable, *[, key])
1.iterable:-这是函数的第一个参数,表示一个可迭代对象(例如列表、元组或集合)。函数将在这个可迭代对象中查找最大值。
2.*:-星号 * 表示后面的参数是可变长度的,也就是说,你可以传递多个额外的位置参数。这意味着你可以将多个可迭代对象一起传递给 max() 函数。例如:max(set1, set2)。
3.[, key]:-方括号 [] 表示这个参数是可选的。在这里,key 是一个可选的参数,它允许你指定一个函数,用来从每个元素中提取比较的值。这个函数将应用于可迭代对象中的每个元素,以确定哪个元素是最大的。-例如,如果你有一个由元组组成的可迭代对象,你可以使用 key 参数来指定根据元组的第二个元素来找到最大值。
# 基本用法
numbers = {1, 3, 2, 5, 4}
maximum = max(numbers) # 返回 5
# 使用可变参数
max_of_multiple_sets = max({1, 2}, {3, 4}) # 返回 4,因为 4 是所有集合中的最大值
# 使用 key 参数
tuples = [(1, 2), (3, 1), (2, 3)]
# 找到元组中第二个元素最大的元组
max_tuple = max(tuples, key=lambda x: x[1]) # 返回 (2, 3)
lambda 表达式
-基本语法:lambda arguments: expression-这里的 arguments 是你想传递给匿名函数的参数,expression 是该函数的返回值。-lambda 函数的特点是它不需要名称(即匿名),并且只能包含单个表达式。
key=lambda x: x[1] 的解释
-在这个上下文中,key 是用于指定一个函数的参数。这个函数会被应用到可迭代对象的每个元素上,以决定如何进行比较。-lambda x: x[1] 则表示这个函数接收一个参数 x,并返回 x 的第二个元素(即索引为 1 的元素)。因此,这里 x 通常是一个可迭代对象中的单个元素,比如元组、列表等。
tuples = [(1, 2), (3, 1), (2, 3)]
max_tuple = max(tuples, key=lambda x: x[1]) # 返回 (2, 3)
每个元组包含两个元素,索引分别为 0 和 1:
第一个元组 (1, 2) 的第一个元素是 1,第二个元素是 2。
第二个元组 (3, 1) 的第一个元素是 3,第二个元素是 1。
第三个元组 (2, 3) 的第一个元素是 2,第二个元素是 3。
然后,max() 函数会根据这些提取的值来找出最大的:
比较 2、1 和 3,显然 3 是最大的。
因此,max(tuples, key=lambda x: x[1]) 返回的结果是 (2, 3),因为该元组的第二个元素 3 是所有元组中最大的。
集合交集、差集、联集和反差集
set1 ={1,2,3} set2={3,4,5}
联集union() or (set1 | set2) | 返回两个集合的联集(所有元素的集合) | set1.union(set2)->{1,2,3,3,4,5} print(set1|set2)->{1,2,3,3,4,5} |
交集intersection() or set1&set2 | 返回两个集合的重复/共同的元素 | set1.intersection(set2)->{3}print(set1&set2)->{3} |
反差集(set1^set2) | 取不重复值(扣除重复) | print(set1^set2)->{1,2,4,5} |
差集difference()or (set1-set2) | 返回存在于第一个集合但不存在于第二个集合的元素 | set1.difference(set2)->{1,2} print(set1-set2)->{1,2} |
子集issubset() | 如果set1所有元素都存在于另一个set2集合中则返回 True,否则返回 False | set1 = {1, 2}set2 = {1, 2, 3, 4}result = set1.issubset(set2) # True |
超集:issuperset() | 如果set2集合的所有元素都存在set1集合中,则返回 True,否则返回 False。 | set1 = {1, 2, 3, 4}set2 = {1, 2}print(result)set1.issuperset(set2) # True |