第十章 集合 (Set)
- 集合的基本观念是无序且每个元素是唯一的,集合元素的内容是不可变的,常见的元素有整数、浮点数、字符串、元组等。至于可变内容列表、字典、集合等不可以是集合元素。但是集合本身是可变的,我们可以增加或删除集合的元素。
10-1 建立集合 set()
- python 可以使用大括号 “ { } ” 或 set() 函数建立集合,下列将分别说明。
10-1-1 使用大括号建立集合
-
python 允许我们直接使用大括号 “ { } ” 设定集合,例如,集合名称是 langs,内容是 ‘ Python ’ 、‘ C ’、‘ Java ’。可以使用下列方式设定集合。
-
例:基本集合建立
langs = { 'Python','C','Java'} print('打印集合:',langs) print("打印类别:",type(langs)) #输出结果 打印集合: { 'Python', 'C', 'Java'} 打印类别: <class 'set'>
-
集合的物色是元素是唯一的,所以如果设定集合时有重复元素情形,多的部分将被舍去。
-
例:基本集合的建立,建立时部分元素重复,观察执行结果
langs = { 'Python','C','Python','Java','C'} print('打印集合:',langs) #输出结果 打印集合: { 'Python', 'C', 'Java'
-
上述 ‘ Python ’ 和 ‘ C ’ 在设定时皆出现 2 次,但是列出时有重复的元素将只保留 1 份,集合内容可以是由不同数据类型组成,可参考下列实例。
-
例:使用整数和不同数据类型所建的集合
#集合由整数所组成 integer_set = { 1,2,3,4,5} print(integer_set) #集合由不同数据型态所组成 mixed_set = { 1,'Python',(2,5,10)} #因为集合元素是不可变的,如果元组所为列表将出现错误 print(mixed_set) #输出结果 { 1, 2, 3, 4, 5} { 1, 'Python', (2, 5, 10)}
-
读者可能会思考,字典是用大括号定义,集合也是用大括号定义,可否直接使用空的大括号定义空集合?可参考下列实例。
-
例:建立空集合并观察执行结果,发现错误的实例
x = { } print("打印 :",x) print("打印类别:",type(x)) #输出结果 打印 : { } 打印类别: <class 'dict'>
-
结果发现使用空的大括号 { } 定义,获得的是空字典,下一小节将会讲解定义空集合的方法。
10-1-2 使用 set() 函数定义集合
-
除了以 10-1-1 节方式建立集合,也可以使用 set() 函数建立集合, set() 函数参数的内容可以是字符串、列表、元组等。这时原先字符串、列表、元组的元素将被转成集合元素。首先笔者回到建立空集合的主题,如果想建立空集合需使用 set() 函数。
-
例:使用 set() 函数建立空集合
empty_dict = { } print("打印类别:",type(empty_dict)) empty_set = set() print("打印类别:",type(empty_set)) #输出结果 打印类别: <class 'dict'> 打印类别: <class 'set'>
-
例:使用字符串建立与打印集合,同时列出集合的数据类型。
x = set("DeepStone mean Deep Learning") print(x) print(type(x)) #输出结果 { 'g', 'o', 'm', 'e', 'D', 'p', 't', 'L', 'S', 'n', ' ', 'r', 'a', 'i'} <class 'set'>
-
由于集合元素具有唯一的特性,所以虽然程序第 2 行原先字符串有许多字母(例如:e)重复,经过 set() 处理后,所有英文字母将没有重复。
-
例:使用列表建立与打印集合
#方式1 fruits = ['apple','orange','apple','banana','orange'] x = set(fruits) print(x) #方式2 y = set(['apple','orange','apple','banana','orange']) print(y) #输出结果 { 'apple', 'orange', 'banana'} { 'apple', 'orange', 'banana'}
-
读者需留意 2 种不同的 set() 函数使用方式,同时原先列表内容已经变为集合元素内容了。
-
例:使用元组建立与打印集合。
cities = set(('Beijing','Tokyo','Beijing','Taipei','Tokyo')) print(cities) #输出结果 { 'Beijing', 'Tokyo', 'Taipei'}
10-1-3 大数据与集合的应用
-
笔者的朋友在某知名企业工作,收集了海量数据使用列表保存,这里面有些数据重复出现,他曾经询问笔者应如何将重复数据删除,笔者告知如果使用 C 语言可能需花几小时解决,但是如果了解 Python 的集合观念,只要花约 1 分钟就解决了。其实只要将列表数据使用 set() 函数转为集合数据,再使用 list() 函数将集合数据转为列表数据就可以了。
-
例:将列表内重复性的数据删除。
fruits1 = ['apple','orange','apple','banana','orange'] x = set(fruits1) fruits2 = list(x) print("原先表列数据 fruits1:",fruits1) print("新的列表数据 fruits2:",fruits2) #输出结果 原先表列数据 fruits1: ['apple', 'orange', 'apple', 'banana', 'orange'] 新的列表数据 fruits2: ['apple', 'orange', 'banana']
10-2 集合的操作
Python 符号 | 说 明 |
---|---|
& | 交集 |
| | 并集 |
- | 差集 |
^ | 对称差集 |
== | 等于 |
!= | 不等于 |
in | 是成员 |
not in | 不是成员 |
10-2-1 交集(intersection)
-
有 A 和 B 两个集合,如果想得相同的元素,则可以使用交集。例如,有数学(可想成 A 集合)与物理(可想成 B 集合)2 个夏令营,如果想统计有哪些人同时参加这 2 个夏令营,则可以使用此功能。
-
在 Python 语言的交集符号是 “ & ” ,另外,也可以使用 intersection() 方法完成这个工作。
-
例:有数学与物理 2 个夏令营,这个程序会列出同时参加这 2 个夏令营的成员。
math = { 'Kevin','Peter','Eric'} # 设定参加数学夏令营成员 physics = { 'Peter','Nelson','Tom'} # 设定参加物理夏令营成员 both = math & physics print("同时参加数学与物理夏令营的成员:",both) #输出结果 同时参加数学与物理夏令营的成员: { 'Peter'}
-
例:使用 intersection() 方法完成交集的应用
A = { 1,2,3,4,5} B = { 3,4,5,6,7} AB = A.intersection(B) print("A和B的交集是:",AB) BA = B.intersection(A) print("B和A的交集是:",BA) #输出结果 A和B的交集是: { 3, 4, 5} B和A的交集是: { 3, 4, 5}
10-2-2 并集(union)
-
有 A 和 B 两个集合,如果想获得所有的元素,则可以使用并集,例如,有数学(可想成 A 集合)与物理(可想成 B 集合)2 个夏令营,如果想统计参加这 2 个夏令营的全部成员,则可以使用 此功能
-
在 Python 语言的并集符号是 " | ",另外,也可以使用 union() 方法完成这个工作。
-
例:有数学与物理 2 个夏令营,这个程序会列出参加这 2 个夏令营的所有成员。
math = { 'Kevin','Peter','Eric'} # 设定参加数