本篇我们开始学习 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

每次执行以上代码,都会以不同的顺序返回集合元素。

在接下来的教程中,我们将会介绍如何执行各种集合操作。例如:集合的并集、交集、差集以及对称差集等。

总结

  • 集合是一个由不可变对象组成的无序列表。