资料来源于Github项目**30-Days-Of-Python,本文为第七章翻译。**
集合(Set)类型
集合是一组元素。让我们回到您的小学或高中数学课。数学上的集合定义也可以应用于Python。集合是一组无序且不可索引的唯一元素。在Python中,集合用于存储唯一的项目,并且可以在集合之间找到联合、交集、差集、对称差集、子集、超集和不相交集。
创建一个集合
我们使用花括号 {} 来创建一个集合,或者使用set()内置函数。
- 创建一个空
Set
# 语法
st = {}
# 或者
st = set()
- 创建具有初始项的
Set
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
示例:
# 语法
fruits = {'banana', 'orange', 'mango', 'lemon'}
获取Set长度
我们可以使用len()方法来获取一个Set的长度。
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
len(set)
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
len(fruits)
访问Set中的元素
我们可以使用循环来访问Set中的元素。这将在循环部分中介绍。
检查元素
要检查一个元素是否存在于一个Set中,我们可以使用成员运算符in。
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
print("Does set st contain item3? ", 'item3' in st) # 集合st是否包含元素item3? True
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
print('mango' in fruits ) # True
向Set中添加元素
一旦创建了一个Set,我们就不能更改其中的任何元素,但是我们可以添加额外的元素。
- 使用
add()方法添加一个元素。
# 算法
st = {'item1', 'item2', 'item3', 'item4'}
st.add('item5')
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.add('lime')
-
使用
update()方法添加多个元素update()方法允许向Set中添加多个元素,该方法需要一个列表作为参数。
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
st.update(['item5','item6','item7'])
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
vegetables = ('tomato', 'potato', 'cabbage','onion', 'carrot')
fruits.update(vegetables)
从Set中移除元素
我们可以使用remove()方法从集合中移除元素。如果找不到该元素,remove()方法将引发错误,因此最好先检查该元素是否存在于给定的集合中。但是,discard()方法不会引发任何错误。
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
st.remove('item2')
pop()方法从列表中随机移除一个元素,并返回被移除的元素。
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.pop() # 随机移除一个元素
如果我们对被移除的元素感兴趣:
fruits = {'banana', 'orange', 'mango', 'lemon'}
removed_item = fruits.pop()
清空Set中的元素
如果我们想要清空Set中的元素,可以使用clear()方法。
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
st.clear()
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
fruits.clear()
print(fruits) # set()
删除Set
如果我们想要删除Set本身,可以使用del运算符。
# 语法
st = {'item1', 'item2', 'item3', 'item4'}
del st
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
del fruits
将List转换为Set
我们可以将List转换为Set,也可以将Set转换为List。将List转换为Set可以去除重复项,只保留唯一的元素。
# 语法
lst = ['item1', 'item2', 'item3', 'item4', 'item1']
st = set(lst) # {'item2', 'item4', 'item1', 'item3'} - 集合是无序的,因此转换后的元素顺序是随机的。
示例:
fruits = ['banana', 'orange', 'mango', 'lemon','orange', 'banana']
fruits = set(fruits) # {'mango', 'lemon', 'banana', 'orange'}
合并Set
我们可以使用union()方法或update()方法合并两个Set。
union()方法会返回一个新的集合。
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item5', 'item6', 'item7', 'item8'}
st3 = st1.union(st2)
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
vegetables = {'tomato', 'potato', 'cabbage','onion', 'carrot'}
print(fruits.union(vegetables)) # {'lemon', 'carrot', 'tomato', 'banana', 'mango', 'orange', 'cabbage', 'potato', 'onion'}
update()方法会将一个集合插入到给定集合中。
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item5', 'item6', 'item7', 'item8'}
st1.update(st2) # st2中的元素添加到st1中
示例:
fruits = {'banana', 'orange', 'mango', 'lemon'}
vegetables = {'tomato', 'potato', 'cabbage','onion', 'carrot'}
fruits.update(vegetables)
print(fruits) # {'lemon', 'carrot', 'tomato', 'banana', 'mango', 'orange', 'cabbage', 'potato', 'onion'}
查找交集元素
交集返回两个Set中都存在的元素集合。请参考下面的示例:
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item3', 'item2'}
st1.intersection(st2) # {'item3', 'item2'}
示例:
whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
even_numbers = {0, 2, 4, 6, 8, 10}
whole_numbers.intersection(even_numbers) # {0, 2, 4, 6, 8, 10}
python = {'p', 'y', 't', 'h', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.intersection(dragon) # {'o', 'n'}
检查子集和超集
一个集合可以是另一个集合的子集或超集:
- 子集:
issubset() - 超集:
issuperset()
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
st2.issubset(st1) # True
st1.issuperset(st2) # True
示例:
whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
even_numbers = {0, 2, 4, 6, 8, 10}
whole_numbers.issubset(even_numbers) # False, 因为它是一个超集
whole_numbers.issuperset(even_numbers) # True
python = {'p', 'y', 't', 'h', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.issubset(dragon) # False
查找两个Set的差集
difference()方法返回两个Set的差集。
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
st2.difference(st1) # set()
st1.difference(st2) # {'item1', 'item4'} => st1\\st2
示例:
whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
even_numbers = {0, 2, 4, 6, 8, 10}
whole_numbers.difference(even_numbers) # {1, 3, 5, 7, 9}
python = {'p', 'y', 't', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.difference(dragon) # {'p', 'y', 't'} - 结果是无序的(这是集合的特点)
dragon.difference(python) # {'d', 'r', 'a', 'g'}
查找两个Set的对称差集
symmetric_difference()方法返回两个集合的对称差集。也就是说,它返回一个集合,其中包含两个集合中所有的元素,除了同时存在于两个集合中的元素,数学上表示为:(A\B) ∪ (B\A)。
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
# 意思是 (A\\B)∪(B\\A)
st2.symmetric_difference(st1) # {'item1', 'item4'}
示例:
whole_numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
some_numbers = {1, 2, 3, 4, 5}
whole_numbers.symmetric_difference(some_numbers) # {0, 6, 7, 8, 9, 10}
python = {'p', 'y', 't', 'h', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.symmetric_difference(dragon) # {'r', 't', 'p', 'y', 'g', 'a', 'd', 'h'}
检查相交Set
如果两个集合没有共同的元素,我们称它们为不相交集。我们可以使用isdisjoint()方法检查两个集合是否相交或不相交。
# 语法
st1 = {'item1', 'item2', 'item3', 'item4'}
st2 = {'item2', 'item3'}
st2.isdisjoint(st1) # False
even_numbers = {0, 2, 4 ,6, 8}
even_numbers = {1, 3, 5, 7, 9}
even_numbers.isdisjoint(odd_numbers) # True, 没有相同项
python = {'p', 'y', 't', 'h', 'o','n'}
dragon = {'d', 'r', 'a', 'g', 'o','n'}
python.isdisjoint(dragon) # False, 有相同项 {'o', 'n'}
评论区