摘要:在本节中,你将学习Python集合类型以及如何有效地使用它。
Python集合类型简介
Python集合是由不可变元素组成的无序序列。这意味着:
集合中的元素是无序的。
集合中的元素是唯一的。集合不允许存在重复元素。
集合中的元素不能被修改。例如,它们可以是数字、字符串和元组,但不能是列表或字典。
在Python中定义一个集合,你要使用花括号 {}
。例如:
skills = {'Python programming', 'Databases', 'Software design'}
请注意,字典也使用花括号,但它的元素是键值对。
要定义一个空集合,你不能像这样使用花括号:
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')
print(skills)
输出:
{'Problem solving', 'Python programming', 'Software design'}
从集合中取出元素
要从集合中移除并返回一个元素,你可以使用 pop()
方法。
由于集合中的元素没有特定的顺序 pop()
方法会从集合中移除一个未指定的元素。
如果你多次执行以下代码,每次它都会显示一个不同的值:
skills = {'Problem solving', 'Software design', 'Python programming'}
skill = skills.pop()
print(skill)
输出:
Problem solving
清空集合
要从一个集合中移除所有元素,你可以使用 clear()
方法:
set.clear()
例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills.clear()
print(skills)
输出:
set()
不可变集合
要使一个集合变为不可变的,你可以使用名为 frozenset()
的内置函数frozenset()
函数会根据一个现有的集合返回一个新的不可变集合。例如:
skills = {'Problem solving', 'Software design', 'Python programming'}
skills = frozenset(skills)
在那之后,如果你试图修改该集合的元素,你将会得到一个错误。
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
请注意,每次运行这段代码时,你得到的集合元素顺序都会不同。
总结
集合是由不可变元素组成的无序集合。