目录
集合
集合的定义
集合操作
集合的内建函数
集合与内置函数
集合练习-1
集合练习-2
集合练习-3
集合
集合的定义
学习关于 Python 集的所有内容;如何创建它们、添加或删除其中的元素,以及在 Python 中对集合执行的所有操作。
Python 中的集合是什么?
集合是项目的无序集合。每个元素都是唯一的(没有重复项),并且必须是不可变的(不能更改)。
但是,集合本身是可变的。我们可以在其中添加或删除项目。
集合可用于执行数学集合运算,例如并集,交集,对称差等。
如何创建集合?
通过将所有项目(元素)放在大括号 {}
中并用逗号分隔或使用内置函数来创建集合 set()
。
它可以具有任意数量的项目,并且它们可以具有不同的类型(整数,浮点数,元组,字符串等)。但是集合不能具有可变元素(例如 list ,set 或 dictionary)作为其元素。
dic1 = {1, 2, 3}
dic2 = {1.0, (1, 2, 3), 'Hello'}
print(dic1)
print(dic2)输出:
{1, 2, 3}
{1.0, (1, 2, 3), 'Hello'}
# 无重复集合
my_set = {1,2,3,4,3,2}
print(my_set)# 我们可以从列表中生成集合
my_set = set([1,2,3,2])
print(my_set)输出:
{1, 2, 3, 4}
{1, 2, 3}
创建一个空集有点特殊。
空括号 {}
将在Python中创建一个空字典。为了建立一个没有任何元素的集合,我们使用没有任何参数的 set()
函数。
x = {} # 用{}初始化
print(type(x)) # 检查a的数据类型x = set() # 初始化使用 set()
print(type(x)) # 检查a的数据类型输出:
<class 'dict'>
<class 'set'>
集合操作
如何在 Python 中更改集合?
集合是可变的。但由于它们是无序的,因此索引没有意义。
我们无法使用索引或切片来访问或更改集合的元素,这是集合不支持的操作。
我们可以使用 add()
方法添加单个元素,使用 update()
方法添加多个元素。update()
方法可以采用元组,列表,字符串或其他集合作为其参数。在所有情况下,都避免重复。
# 初始化 my_set
my_set = {1,3}
print(my_set)# 增加一个元素
my_set.add(2)
print(my_set)# 增加多个元素
my_set.update([2,3,4])
print(my_set)# 增加 list、set、tuple
my_set.update([4,5], {1,6,8},(9,10))
print(my_set)输出:
{1, 3}
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 8, 9, 10}
从集合中删除元素
可以使用 discard()
和 remove()
方法从集合中删除特定项目。
两者之间的唯一区别是,如果使用 discard()
,而项目不存在于集合中,则它保持不变。但是 remove()
在这种情况下会引发错误。
set_1 = {1,2,3,"hello"}
print(set_1.remove(1))
print(set_1)set_1.discard("hello")
print(set_1)输出:
None
{2, 3, 'hello'}
{2, 3}
同样,我们可以使用 pop()
方法删除并返回一个项目。
集合为无序,无法确定将弹出哪个项目。这是完全任意的。
我们还可以使用 clear()
方法删除集合中的所有项目。
set_2 = {"shell",2,5,"bash"}set_2.pop() # 使用pop方法删除一个元素,并且随机输出!
print(set_2)set_2.clear() #使用clear方法删除所有的元素
print(set_2)输出:
{2, 5, 'shell'}
set()
Python 集合操作
集合可用于执行数学集合运算,例如并集,交集,差和对称差。我们可以通过运算符或方法来实现。
集合并集
A 和 B 的并集是来自这两个集合的所有元素的集合。
并集是使用 |
操作符执行的。也可以使用 union()
方法来完成。
# 初始化 A 和 B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}# 使用 | 运算符
print(A | B)#使用union()方法进行并集操作
print(A.union(B))
print(B.union(A))输出:
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
集合相交
A 和 B 的交集是在这两个集合中共有的一组元素。
交点使用 &
运算符执行。使用 intersection()
方法可以完成相同的操作。
x = {1,2,3,4,5,6}
y = {4,5,6,7,8,9}#使用&进行交集操作
print(x & y)#使用intersection()方法进行交集
print(x.intersection(y))
print(y.intersection(x))输出:
{4, 5, 6}
{4, 5, 6}
{4, 5, 6}
集合差异
A 和 B 的差 A - B 是仅在 A 中但不在 B 中的一组元素。类似地,B - A 是 B 中但不在 A 中的一组元素。
差异是使用 -
运算符执行的。使用 difference()
方法可以完成相同的操作。
x = {1,2,3,4,5,6}
y = {4,5,6,7,8,9}print(x - y)
print(x.difference(y))print(y - x)
print(y.difference(x))输出:
{1, 2, 3}
{1, 2, 3}
{8, 9, 7}
{8, 9, 7}
集合对称差异
A 和 B 的对称差异是 A 和 B 中的一组元素,但两者中的元素相同。
对称差使用 ^
运算符执行。使用 symmetric_difference()
方法可以完成相同的操作。
x = {1,2,3,4,5,6}
y = {4,5,6,7,8,9}print(x ^ y)
print(y ^ x)print(x.symmetric_difference(y))
print(y.symmetric_difference(x))输出:
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
集合的内建函数
不同的 Python 集合方法
集合方法很多,上面已经使用了其中的一些方法。这是 set (集合)对象可用的所有方法的列表。
方法 | 描述 |
---|---|
add() | 将元素添加到集合中 |
clear() | 从集合中删除所有元素 |
copy() | 返回集合的副本 |
difference() | 返回两个或多个集合的差作为新集合 |
difference_update() | 从该集合中删除另一个集合的所有元素 |
discard() | 如果元素是成员,则从集合中删除它。(如果元素不在集合中,则不执行任何操作) |
intersection() | 返回两个集合的交集作为新集合 |
intersection_update() | 用自身和另一个的交集更新集合 |
isdisjoint() | 如果两个集合的交点为空,则返回 True,否则返回 False。 |
issubset() | 返回 True 另一个集合是否包含此集合 |
issuperset() | 返回 True 此集合是否包含另一个集合 |
pop() | 删除并返回一个任意的 set 元素。如果集合是空的,调用 pop() 方法将会引发 KeyError 异常! |
remove() | 从集合中删除一个元素。如果元素不是成员,则引发一个 KeyError |
symmetric_difference() | 将两个集合的对称差作为新集合返回 |
symmetric_difference_update() | 用本身和另一个的对称差异更新一个集合 |
union() | 返回新集合中集合的并集 |
update() | 用自身和其他元素的并集更新集合 |
其他集合操作
集合会员资格测试
我们可以使用 in 关键字来测试项目是否存在于集合中。
# 初始化 my_set
my_set = set("apple")# 检查“a”是否存在
print('a' in my_set)# 检查“p”是否存在
print('p' not in my_set)输出:
True
False
遍历集合 使用 for 循环,我们可以遍历集合中的每个项目。(由于集合是无序的,运行结果顺序可能不同)
for x in set("hello"):print(x)输出:
h
o
e
l
集合与内置函数
内置函数如 all()
、any()
、enumerate()
、len()
、max()
、min()
、sort()
、sum()
等常用来与 set 一起执行不同的任务。
功能 | 描述 |
---|---|
all() | 如果集合的所有元素都为 True(或者集合为空),则返回 True。 |
any() | 如果集合中的任何元素为 True,则返回 True。 如果集合为空,则返回False。 |
enumerate() | 返回一个枚举对象。它包含成对的所有项的索引和值。 |
len() | 返回集合中的长度(项目数)。 |
max() | 返回集合中最大的项目。 |
min() | 返回集合中最小的项目。 |
sorted() | 从集合中的元素返回一个新的排序列表(不对集合本身进行排序)。 |
sum() | 返回集合中所有元素的总和。 |
Python Frozenset
frozenset
是 Python 中的一种数据类型,类似于 set
,但具有不可变性,即一旦创建后不能被修改。与 set
不同,frozenset
是一种不可变集合。
与 set
类型不同,frozenset
类型的对象可以作为字典的 key,也可以作为另一个集合的元素,这是因为 frozenset
是不可变的,具有哈希值,可以进行哈希运算。
可以使用函数 Frozenset()
创建 Frozensets 。
此数据类型支持的方法,如 copy()
,difference()
,intersection()
,isdisjoint()
,issubset()
,issuperset()
,symmetric_difference()
和 union()
。由于不可变,因此没有添加或删除元素的方法。
# 初始化 A 和 B
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])print(A.isdisjoint(B)) # (使用isdisjoint()函数来判断两个集合是否存在交集,如果存在返回false,反之返回true!)
print(A.difference(B)) # (差集)
print(A | B) # union()输出:
False
frozenset({1, 2})
frozenset({1, 2, 3, 4, 5, 6})
集合练习-1
集合中最大的元素描述
输入一个非空集合 my_set,输出 my_set 中最大的元素。
my_set = eval(input())'''
print(max(my_set))
# 直接使用max函数!
''''''
print(sorted(my_set)[-1])
使用 sorted(my_set) 对集合中的元素进行排序,并取最后一个元素(即最大值),最后将其打印出来!
'''多种解法
集合练习-2
集合运算描述
给你三个集合 my_dict1、my_dict2 和 my_dict3,输出在前两个集合中都存在,但不在第三个集合中的元素个数。
my_set1 = eval(input())
my_set2 = eval(input())
my_set3 = eval(input())
'''
意思就是求set1和set2的交集,再求与set3的差集!(输出差集的个数)
'''
print(len((my_set1 & my_set2) - my_set3))
集合练习-3
集合中绝对值小于 10 的元素之和描述
给你一个整数集合 my_set,输出集合中绝对值小于 10 的元素之和。
my_set = eval(input())
sum_abs_lt_10 = sum(x for x in my_set if abs(x) < 10)
print(sum_abs_lt_10)'''
这段代码实现了以下功能:1. eval(input()): 通过 input() 函数提示用户输入一个表达式,然后 eval() 函数将这个表达式作为 Python 代码进行求值,得到一个集合对象并将其赋值给变量 `my_set`。
用户输入的表达式应该是一个包含整数元素的集合,例如 `{1, 2, 3, 4, 5}`。2. sum(x for x in my_set if abs(x) < 10): 这段代码使用列表推导式来计算集合 `my_set` 中绝对值小于 10 的元素之和。具体地,对于集合 `my_set` 中的每个元素 `x`,
只有当 `x` 的绝对值小于 10 时,才将这个 `x` 累加到求和结果中。3. print(sum_abs_lt_10): 最后,将上一步计算得到的绝对值小于 10 的元素之和打印输出。
'''