首页 > 编程笔记

Python集合(set)的用法

Python 集合(Set)与字典一样,都是把元素放在大括号{}内,不过集合只有键而没有值,类似数学里的集合,可以进行并集|、交集&、差集-与异或^等运算。

另外,集合里的元素没有顺序之分,而且相同元素不可重复出现。所以集合不会记录元素的位置,当然也不支持索引或切片运算。

集合内的元素是不可变的,常见可以作为集合元素的有整数、浮点数、字符串、元组,而列表、字典、集合这类具有可变性质的数据类型则不能成为集合的元素。虽然说集合内的元素必须是不可变的,但是集合本身可以增加或删除元素,因此集合本身是可变的。

Python集合简介

集合可以使用大括号“{}”或 set() 函数建立,使用大括号“{}”建立集合的方式如下。

集合名称={元素1,元素2,...}

例如下面的代码:
animal = {"tiger", "sheep", "elephant"}
print(animal)
print(type(animal))
输出结果:

{'tiger', 'sheep', 'elephant'}
<class 'set'>

注意,建立集合时,大括号内要有元素,否则 Python 会把它视为字典而不是集合。例如,x={} 表示 x 是一个字典而不是集合,例如下面的代码。
animal = {}
print(animal)
print(type(animal))
输出结果:

{}
<class 'dict'>


另外,集合的元素必须是唯一的。如果集合中有重复的元素,那么这些相同的元素只会保留一个,例如下面的代码。
animal = {"tiger", "sheep", "elephant",
        "lion", "sheep", "bird",
        "cat", "snake", "tiger"}
print(animal)
输出结果:

{'snake', 'lion', 'bird', 'tiger', 'elephant', 'cat', 'sheep'}


除了可以用大括号建立集合外,也可以使用 set() 函数建立集合,set() 函数所传入的参数内容可以是列表、字符串、元组。使用 set() 函数建立空集合的范例如下。

set1=set()
print(set1)


如果我们收集的数据是用列表来保存的,但不确定其中是否有重复的元素,举例来说,如果收集了一堆单词,并以列表来保存这些收集的单词,为了避免所收集的单词重复出现,此时就可以利用集合的元素的唯一性来去除重复收集的单词。

【示例1】将所收集到的列表数据中的重复元素删除,并以另外的列表来保存这些不重复的元素。代码如下:
original= ["abase", "abate", "abdicate","abhor", "abate", "acrid","appoint", "abate", "kindle"]
print("单词收集的原始内容: ")
print(original)
set1=set(original)
not_duplicatd=list(set1)
print("删除重复单词后的内容: ")
print(not_duplicatd)
print("按照字母的顺序排列: ")
not_duplicatd.sort()
print(not_duplicatd)
输出结果:

单词收集的原始内容:
['abase', 'abate', 'abdicate', 'abhor', 'abate', 'acrid', 'appoint', 'abate', 'kindle']
删除重复单词后的内容:
['abhor', 'abate', 'abdicate', 'abase', 'acrid', 'kindle', 'appoint']
按照字母的顺序排列:
['abase', 'abate', 'abdicate', 'abhor', 'acrid', 'appoint', 'kindle']

程序解说:

Python集合的运算

两个集合可以做并集|、交集&、差集-与异或^等运算,如表 1 所示。

表1 集合运算范例
集合运算 范例 说明
并集“|” A|B 存在集合A或存在集合B
交集“&” A&B 存在集合A也存在集合B
差集“-” A-B 存在集合A但不存在集合B
异或“^” A^B 排除集合A与集合B中的相同元素

【示例2】以下范例说明了集合的运算操作方式。python代码如下:
friendA= {"Andy", "Axel", "Michael","May"}
friendB = {"Peter", "Axel", "Andy","Julia"}
print(friendA & friendB)
print(friendA | friendB)
print(friendA - friendB)
print(friendA ^ friendB)
输出结果:

{'Axel', 'Andy'}
{'Julia', 'Axel', 'Michael', 'Andy', 'Peter', 'May'}
{'Michael', 'May'}
{'Julia', 'Michael', 'Peter', 'May'}

集合内的元素可以是相同数据类型,也可以是不同数据类型。

但要把握一项原则,即集合的元素是不可变的,因此元组可以作为集合的元素,但是列表就不可以作为集合的元素,因为列表是一种可变的元素。

从以下两个例子可以清楚地看出如果在集合中加入列表将会产生错误。

【示例3】python代码如下:
set1={5,6,7,3,9}
print(set1)
set2={8,5,"happy","1235",(3,2,5),('a','b')}
print(set2)
输出结果:

{3, 5, 6, 7, 9}
{'happy', 5, '1235', 8, ('a', 'b'), (3, 2, 5)}


【示例4】错误代码如下:
set3={8,5,"happy","1235",[3,2,5],('a','b')}
print(set3)
输出结果:

  File "C:\Users\27580\Desktop\2.py", line 1, in <module>
    set3={8,5,"happy","1235",[3,2,5],('a','b')}
TypeError: unhashable type: 'list'

可以发现,如果在集合中加入列表就会出现 TypeError 的错误。

Python常用的集合函数

下面将介绍常用的集合函数。

1) 新增与删除函数 add() 与 remove()

add() 函数一次只能新增一个元素,如果要新增多个元素,可以使用 update() 函数,以下是 add() 与 remove() 函数的使用方式。

add() 函数使用方法。python 代码如下:
friend= {"Andy", "Axel", "Michael","May"}
friend.add("Patrick")
print(friend)
输出结果:

{'Axel', 'Patrick', 'Andy', 'Michael', 'May'}


remove() 函数使用方法。python 代码如下:
friend= {"Andy", "Axel", "Michael","May"}
friend.remove("Andy")
print(friend)
输出结果:

{'Axel', 'May', 'Michael'}

2) 更新或合并函数update()

update() 函数可以将两个集合合并,格式如下。

set1.update(set2)

set1 会与 set2 合并,由于集合不允许有重复的元素,因此重复的元素会被忽略,例如下面的代码:
friend = {"Andy", "May", "Axel"}
friend.update({"Andy", "May","John","Michael"})
print(friend)
输出结果:

{'Andy', 'Michael', 'Axel', 'May', 'John'}


建立集合后,可以使用 in 语句来测试元素是否在集合中,例如下面的代码。

friend = {"Andy", "May", "Axel"}
print("Mike" in friend)  #输出False

“Mike”并不在集合内,所以就会返回 False。

【示例5】列出通过及不通过测试的同学名单。python 代码如下:
#小班制的同学清单
classmate={'陈大庆','许大为','朱时中','庄秀文','吴彩凤',
           '黄小惠','曾明宗','马友友','韩正文','胡天明'}
test1={'陈大庆','许大为','朱时中','马友友','胡天明'} #通过中高级测试的同学名单
test2={'许大为','朱时中','吴彩凤','黄小惠','马友友','韩正文'} #通过中级测试的同学名单
goodguy=test1 | test2
print("全班有 %d 人通过两种测试中的其中一种" %len(goodguy), goodguy)
bestguy=test1 & test2
print("全班有 %d 人两种测试全部通过" %len(bestguy), bestguy)
poorguy=classmate -goodguy
print("全班有 %d 人没有通过任何测试" %len(poorguy), poorguy)
输出结果:

全班有 8 人通过两种测试中的其中一种 {'胡天明', '朱时中', '吴彩凤', '马友友', '黄小惠', '韩正文', '陈大庆', '许大为'}
全班有 3 人两种测试全部通过 {'朱时中', '许大为', '马友友'}
全班有 2 人没有通过任何测试 {'庄秀文', '曾明宗'}

程序解说:

优秀文章