题目
选择一到简单的倒排索引来作为这次的例题。
可以很明显的发现,我们传入了两个list,将他设置为两个集合,然后求他们的交集,并按照从大到小的顺序排序即可。
def solution(a, b):
# 使用集合操作找出两个列表的交集
intersection = set(a) & set(b)
# 将交集结果转为列表并按从大到小的顺序排序
result = sorted(intersection, reverse=True)
return result
if __name__ == '__main__':
print(solution([1, 2, 3, 7], [2, 5, 7]) == [7, 2])
print(solution([1, 4, 8, 10], [2, 4, 8, 10]) == [10, 8, 4])
print(solution([3, 5, 9], [1, 4, 6]) == [])
print(solution([1, 2, 3], [1, 2, 3]) == [3, 2, 1])
-
使用
set将两个列表转为集合,可以快速求交集。 -
使用
set(a) & set(b)得到两个集合的交集。 -
使用
sorted对交集进行降序排序,返回结果。
python的集合操作
集合(set)是 Python 中非常强大且灵活的数据类型之一,专门用于存储 无序 且 不重复 的元素集合。它是基于数学集合理论实现的,支持集合的基本操作如交集、并集、差集等,同时也提供了丰富的方法用于高效地处理数据。
1. 创建集合
集合可以通过两种方式创建:
1.1 使用大括号{}
直接用大括号列出元素即可创建集合:
python
复制代码
# 创建一个集合
my_set = {1, 2, 3, 4, 5}
print(my_set) # 输出:{1, 2, 3, 4, 5}
-
注意:集合中的元素是 无序的,因此打印结果的顺序可能与声明顺序不同。
-
重复元素会被自动去重:
python 复制代码 my_set = {1, 2, 2, 3} print(my_set) # 输出:{1, 2, 3}
1.2 使用 set() 构造函数
如果数据源是列表、元组或字符串等其他可迭代对象,可以用 set() 构造集合:
python
复制代码
# 从列表创建集合
my_set = set([1, 2, 3, 4, 5, 5])
print(my_set) # 输出:{1, 2, 3, 4, 5}
# 从字符串创建集合(会去重)
my_set = set("hello")
print(my_set) # 输出:{'h', 'e', 'l', 'o'}
-
空集合:空集合不能用
{}创建,必须使用set():python 复制代码 empty_set = set() print(empty_set) # 输出:set()
2. 集合的特性
2.1 元素的唯一性
集合自动去除重复值。例如:
python
复制代码
my_set = {1, 1, 2, 2, 3}
print(my_set) # 输出:{1, 2, 3}
2.2 元素的不可变性
集合的元素必须是不可变类型,例如数字、字符串或元组。
python
复制代码
# 正确
my_set = {1, "hello", (1, 2, 3)}
# 错误:列表是可变的,不能作为集合的元素
my_set = {1, [1, 2, 3]} # 会抛出TypeError
3. 集合的基本操作
3.1 添加元素
使用 add() 方法添加元素:
python
复制代码
my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # 输出:{1, 2, 3, 4}
-
如果添加的元素已存在,集合不会有任何变化。
python 复制代码 my_set.add(3) print(my_set) # 输出:{1, 2, 3, 4}
3.2 删除元素
-
使用
remove()方法删除指定元素:python 复制代码 my_set = {1, 2, 3} my_set.remove(2) print(my_set) # 输出:{1, 3}如果元素不存在,会抛出
KeyError。 -
使用
discard()方法删除元素:python 复制代码 my_set = {1, 2, 3} my_set.discard(2) print(my_set) # 输出:{1, 3}如果元素不存在,不会抛出错误。
-
使用
pop()随机删除一个元素:python 复制代码 my_set = {1, 2, 3} removed = my_set.pop() print(removed) # 输出:随机删除的元素 print(my_set) # 输出:剩余的集合 -
使用
clear()清空集合:python 复制代码 my_set = {1, 2, 3} my_set.clear() print(my_set) # 输出:set()
4. 集合运算
Python 提供了一系列集合运算符和方法,用于高效地处理集合之间的关系。
4.1 交集
找出两个集合的共有元素。
-
使用
&运算符:python 复制代码 set1 = {1, 2, 3} set2 = {2, 3, 4} result = set1 & set2 print(result) # 输出:{2, 3} -
使用
intersection()方法:python 复制代码 result = set1.intersection(set2) print(result) # 输出:{2, 3}
4.2 并集
将两个集合的所有元素合并(去重)。
-
使用
|运算符:python 复制代码 result = set1 | set2 print(result) # 输出:{1, 2, 3, 4} -
使用
union()方法:python 复制代码 result = set1.union(set2) print(result) # 输出:{1, 2, 3, 4}
4.3 差集
找出只在一个集合中存在的元素。
-
使用
-运算符:python 复制代码 result = set1 - set2 print(result) # 输出:{1} -
使用
difference()方法:python 复制代码 result = set1.difference(set2) print(result) # 输出:{1}
4.4 对称差集
找出只在一个集合中存在,而不同时存在于两个集合中的元素。
-
使用
^运算符:python 复制代码 result = set1 ^ set2 print(result) # 输出:{1, 4} -
使用
symmetric_difference()方法:python 复制代码 result = set1.symmetric_difference(set2) print(result) # 输出:{1, 4}
5. 集合方法
以下是集合支持的一些常用方法:
5.1 检查子集和超集
-
issubset():判断一个集合是否是另一个集合的子集。python 复制代码 set1 = {1, 2} set2 = {1, 2, 3} print(set1.issubset(set2)) # 输出:True -
issuperset():判断一个集合是否是另一个集合的超集。python 复制代码 print(set2.issuperset(set1)) # 输出:True
5.2 检查交集
-
isdisjoint():判断两个集合是否没有交集。python 复制代码 set1 = {1, 2} set2 = {3, 4} print(set1.isdisjoint(set2)) # 输出:True
5.3 复制集合
-
使用
copy()方法创建集合的副本:python 复制代码 set1 = {1, 2, 3} set_copy = set1.copy() print(set_copy) # 输出:{1, 2, 3}
一些简单的实例
示例1:数据去重
快速去重是集合最常见的应用场景:
python
复制代码
data = [1, 2, 2, 3, 4, 4, 5]
unique_data = list(set(data))
print(unique_data) # 输出:[1, 2, 3, 4, 5]
示例2:快速查找公共元素
假设有两个学生名单,找到两个班级的共同学生:
python
复制代码
class1 = {"Alice", "Bob", "Charlie"}
class2 = {"Bob", "David", "Charlie"}
common_students = class1 & class2
print(common_students) # 输出:{'Bob', 'Charlie'}
有关于豆包ai
这一次豆包marcodes直接秒了这道题,对与题目的分析也比较合适,重点是通过这个可以学习很多python的集合相关的语法。