本篇我们开始学习 Python 中的集合(Set)数据类型和相关的操作。
集合数据类型
Python 中的集合是一个由不可变元素组成的无序列表。这意味着:
- 集合中的元素没有顺序。
- 集合中的元素具有唯一性。集合中不允许存在重复的元素。
- 集合中的元素只能是不可变对象,例如数字、字符串以及元组。集合中的元素不能是列表或者字典。
在 Python 中定义集合使用大括号({}),例如:
skills = {'Python programming','Databases', 'Software design'}
字典也使用大括号进行定义,但是它的元素是键值(key-value)对。
定义空集合不能使用以下形式的大括号:
empty_set = {}
因为上面的代码表示定义一个空字典。
定义空集合需要使用内置的 set() 函数:
empty_set = set()
在计算布尔值时,空集合的结果为 False。例如:
skills = set()
if not skills:
print('Empty sets are falsy')
输出结果如下:
Empty sets are falsy
实际上,我们可以将一个可遍历对象传递给 set() 函数创建一个集合。例如,以下代码使用列表和 set() 函数创建集合:
skills = set(['Problem solving','Critical Thinking'])
print(skills)
输出结果如下:
{'Critical Thinking', 'Problem solving'}
注意,集合中的元素可能不会再保留原始列表中的顺序。
如果可遍历对象中存在重复的元素,set() 函数将会删除重复数据。例如:
characters = set('letter')
print(characters)
输出结果如下:
{'r', 'l', 't', 'e'}
以上示例中的单词“letter”包含两个 e 和两个 t 字母, set() 分别删除了一个重复值。
获取集合的大小
内置的 len() 函数可以用于返回集合中元素的个数。
len(set)
例如:
ratings = {1, 2, 3, 4, 5}
size = len(ratings)
print(size)
输出结果如下:
5
检查集合中元素的存在性
如果想要判断集合中是否存在某个元素,可以使用 in 操作符:
element in set
如果集合中存在指定元素,in 操作符将会返回 True;否则,返回 False。例如:
ratings = {1, 2, 3, 4, 5}
rating = 1
if rating in ratings:
print(f'The set contains {rating}')
输出结果如下:
The set contains 1
在 in 操作符前加上 not,可以执行相反的判断。例如:
ratings = {1, 2, 3, 4, 5}
rating = 6
if rating not in ratings:
print(f'The set does not contain {rating}')
输出结果如下:
The set does not contain 6
向集合中增加元素
如果想要将某个元素添加到集合中,可以使用 add() 方法:
set.add(element)
例如:
skills = {'Python programming', 'Software design'}
skills.add('Problem solving')
print(skills)
输出结果如下:
{'Problem solving', 'Software design', 'Python programming'}
删除集合中的指定元素
如果想要从集合中删除某个元素,可以使用 remove() 方法:
set.remove(element)
例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills.remove('Software design')
print(skills)
输出结果如下:
{'Problem solving', 'Python programming'}
如果删除的元素不存在,将会返回一个错误信息。例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills.remove('Java')
错误信息如下:
KeyError: 'Java'
为了避免以上错误,我们可以在删除元素之前使用 in 操作符检查该元素是否存在:
skills = {'Problem solving', 'Software design', 'Python programming'}
if 'Java' in skills:
skills.remove('Java')
为了方便使用,集合提供了删除元素的 discard() 方法。被删除的元素不存在时该方法不会返回错误:
set.discard(element)
例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills.discard('Java')
返回集合中的指定元素
如果想要删除并返回集合中的某个元素,可以使用 pop() 方法。由于集合中的元素没有顺序,pop() 方法从集合中随机删除一个元素。
如果我们多次执行以下代码,每次会显示不同的结果:
skills = {'Problem solving', 'Software design', 'Python programming'}
skill = skills.pop()
print(skill)
删除集合中的全部元素
如果想要删除集合中的所有元素,可以使用 clear() 方法:
set.clear()
例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills.clear()
print(skills)
输出结果如下:
set()
冻结集合
内置函数 frozenset() 可以将集合设置为不可变,该函数基于已有集合创建一个新的不可变集合。例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills = frozenset(skills)
在此之后,如果我们尝试修改集合的元素,将会返回错误:
skills.add('Django')
AttributeError: 'frozenset' object has no attribute 'add'
遍历集合中的元素
集合是一种可遍历对象,我们可以使用 for 循环遍历集合中的元素。例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
for skill in skills:
print(skill)
输出结果如下:
Software design
Python programming
Problem solving
如果想要在循环内部访问当前元素的下标,可以使用内置的 enumerate() 函数:
skills = {'Problem solving', 'Software design', 'Python programming'}
for index, skill in enumerate(skills):
print(f"{index}.{skill}")
输出结果如下:
0.Software design
1.Python programming
2.Problem solving
默认情况下,元素的下标从 0 开始。如果想要改变这种行为,可以为 enumerate() 函数指定第二个参数。例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
for index, skill in enumerate(skills, 1):
print(f"{index}.{skill}")
输出结果如下:
1.Python programming
2.Problem solving
3.Software design
每次执行以上代码,都会以不同的顺序返回集合元素。
在接下来的教程中,我们将会介绍如何执行各种集合操作。例如:集合的并集、交集、差集以及对称差集等。
总结
- 集合是一个由不可变对象组成的无序列表。