Python 程序设计入门(010)—— 集合的操作

Python 程序设计入门(010)—— 集合的操作

Python 中的集合(set)与数学中的集合概念类似,用于保存不重复的元素。有可变集合(set)和不可变集合(frozenset)两种。

在形式上,集合的所有元素放在一对大括号 {} 中,两个相邻元素之间使用逗号(,)分隔。

一、集合的特征

集合有如下特点:

(1)可以容纳多个数据;
(2)可以容纳不同类型的数据;
(3)数据是无序存储的(不支持下标索引);
(4)不允许重复数据存在;
(5)可以修改(增加或删除元素等)
(6)支持 for 循环。

集合和列表、元组、字符串等定义基本相同:

(1)列表使用中括号:[ ]
(2)元组使用小括号:( )
(3)字符串使用单引号或双引号:" "
(4)集合使用大括号:{ }

注意:集合是可修改的数据类型,但集合中的元素必须是不可修改的类型。即:集合中元素只能是数值、字符串、元组等。

二、创建集合

可以使用大括号 {} 或者 set() 函数创建集合。注意:创建一个空集合必须用 set() 而不是 {},因为 {} 是用来创建一个空字典。

1、使用 {} 创建集合

语法格式如下:

扫描二维码关注公众号,回复: 16730224 查看本文章
setname = {
    
    element1, element2, ... , elementn}

说明:使用此方法不能创建空集合。

例如:

set1 = {
    
    1,2,3,4,5}
set2 = {
    
    "Tom","Jerry","John","Black"}
set3 = {
    
    }  # set3的类型为字典(dict)
print(set1)
print(set2)
print(type(set2))
print(set3)
print(type(set3))

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    1, 2, 3, 4, 5}
{
    
    'Black', 'John', 'Jerry', 'Tom'}
<class 'set'>
{
    
    }
<class 'dict'>

2、使用 set() 函数创建集合

使用 set() 函数可以创建空集合,也可以将列表、元组等其他可迭代对象转化为集合。set() 函数的语法格式如下:

set1 = set()
tuple1 = ("Tom","Jerry","John","Black")
list1 = [1,22,44,20,51]
set2 = set(tuple1)
set3 = set(list1)
print(set1)
print(type(set1))
print(set2)
print(type(set2))
print(set3)
print(type(set3))

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set()
<class 'set'>
{
    
    'Black', 'Jerry', 'Tom', 'John'}
<class 'set'>
{
    
    1, 44, 51, 20, 22}
<class 'set'>

集合和列表非常相似 。两者的不同点如下:

(1)集合中只能存储不可变对象,因此集合的元素不能是列表或集合,但可以是元组。

例1:如下程序报错,原因是列表为可变序列。

set3 = {
    
    [1,2],3}
print(set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):
  File "C:\Python\Python38\First.py", line 3, in <module>
    set3 = {
    
    [1,2],3}
TypeError: unhashable type: 'list'

例2:如下所示的程序,元组为不可变序列。

set3 = {
    
    (1,2),3}
print(set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    3, (1, 2)}

例3:如下程序报错,原因是集合为可变序列。

set3 = {
    
    {
    
    1,2},3}
print(set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):
  File "C:\Python\Python38\First.py", line 1, in <module>
    set3 = {
    
    {
    
    1,2},3}
TypeError: unhashable type: 'set'

例4:如下所示的程序,frozenset 为不可变序列。

set1 = frozenset({
    
    1,2})
set2 = {
    
    set1,3}
print(set1)
print(type(set1))
print(set2)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
frozenset({
    
    1, 2})
<class 'frozenset'>
{
    
    3, frozenset({
    
    1, 2})}

(2)集合中存储的对象是无序的(不是按照元素的插入顺序保存),不支持索引与切片。

例如:

set1 = {
    
    1,2,3,4,5}
print(set1[2])

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):
  File "C:\Python\Python38\First.py", line 2, in <module>
    print(set1[2])
TypeError: 'set' object is not subscriptable

(3)集合中不能出现重复的元素,如果定义时出现重复的元组,则自动去重后保存。

例如:

set1 = {
    
    1,1,2,2,3,3}
print(set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    1, 2, 3}

二、集合的修改

因为集合是无序的,所以集合不支持下标索引访问。但集合和列表一样,是允许修改的。集合支持以下几种形式的修改操作:

(1)添加新元素;
(2)移除元素;
(3)从集合中随机取出元素;
(4)清空集合;
(5)消除两个集合的差集;
(6)两个集合合并;
(7)统计集合元素数量。

1、向集合中添加新元素

(1)使用 add() 方法可以将指定元素,添加到集合内。语法格式如下:

setname.add(元素)

例如:

set1 = {
    
    "Tom","Jerry","John","Black"}
set1.add("Rose")
print(set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Rose', 'Tom', 'Black', 'Jerry', 'John'}

(2)通过 update() 方法添加一个序列到当前集合。语法格式如下:

setname.update(序列)

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Zhangsan","Lisi"}
print(set1)
print(set2)
set1.update(set2)
print(set1)
print(set2)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Tom', 'Rose', 'Black', 'John', 'Jerry', 'White'}
{
    
    'Zhangsan', 'Lisi'}
{
    
    'Zhangsan', 'Lisi', 'Tom', 'Rose', 'Black', 'John', 'Jerry', 'White'}
{
    
    'Zhangsan', 'Lisi'}

2、删除元素

(1)方法 remove() 将指定元素从集合内删除。语法格式如下:

setname.remove(元素)

例如:

set1 = {
    
    "Tom","Jerry","John","Black"}
set1.remove("John")
print(set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Black', 'Tom', 'Jerry'}

(2)使用 del 语句可以删除整个集合。语法格式如下:

del setname

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
print(set1)
del set1
print(set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'White', 'John', 'Tom', 'Rose', 'Black', 'Jerry'}
Traceback (most recent call last):
  File "C:\Python\Python38\First.py", line 4, in <module>
    print(set1)
NameError: name 'set1' is not defined

3、从集合中随机取出元素(同时从集合中删除该元素)

使用方法 pop() 可以从集合中取出第一个元素。同时集合本身被修改,元素被移除。pop() 方法的语法格式如下:

setname.pop()

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
print(set1)
a=set1.pop()
print(a)
print(set1)
a=set1.pop()
print(a)
print(set1)
print(a)
a=set1.pop()
print(set1)
print(a)
a=set1.pop()
print(a)
print(set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'White', 'Tom', 'Jerry', 'Black', 'Rose', 'John'}
White
{
    
    'Tom', 'Jerry', 'Black', 'Rose', 'John'}
Tom
{
    
    'Jerry', 'Black', 'Rose', 'John'}
Tom
{
    
    'Black', 'Rose', 'John'}
Jerry
Black
{
    
    'Rose', 'John'}

4、清空集合

方法 clear() 可以清空集合。语法格式如下:

setname.clear()

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
print(set1)
set1.clear()
print(set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Jerry', 'White', 'Tom', 'John', 'Black', 'Rose'}
set()

5、删除两个集合的差集

对比集合1和集合2,在集合1内,删除和集合2相同的元素。集合1被修改,集合2不变。语法格式如下:

setname1.difference_update(setname2)

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "John","Ligang","White","Zhangjing"}
print(set1)
print(set2)
set1.difference_update(set2)
print(set1)
print(set2)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Tom', 'Jerry', 'White', 'Rose', 'John', 'Black'}
{
    
    'Ligang', 'John', 'Zhangjing', 'White'}
{
    
    'Tom', 'Jerry', 'Rose', 'Black'}
{
    
    'Ligang', 'John', 'Zhangjing', 'White'}

6、合并两个集合

将集合1和集合2组合成新集合,集合1和集合2不变,语法格式如下:

setname1.union(setname2)

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "John","Ligang","White","Zhangjing"}
print(set1)
print(set2)
set3 = set1.union(set2)
print(set1)
print(set2)
print(set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'John', 'Jerry', 'Black', 'White', 'Rose', 'Tom'}
{
    
    'Ligang', 'John', 'White', 'Zhangjing'}
{
    
    'John', 'Jerry', 'Black', 'White', 'Rose', 'Tom'}
{
    
    'Ligang', 'John', 'White', 'Zhangjing'}
{
    
    'John', 'Jerry', 'Black', 'Ligang', 'White', 'Rose', 'Tom', 'Zhangjing'}

三、集合的遍历

(1)集合不支持下标索引,但可以用 for 循环遍历集合中的元素。例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
for x in set1:print(x)
    
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Tom
John
White
Rose
Black
Jerry

(2)查找集合中是否存在某个元素

使用 in 和 not in 可以判断一个元素是否存在于一个集合中。格式如下:

element in setname

例如:

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
print("Jerry" in set1)
print("JERRY" in set1)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
True
False

四、集合的并、交、差运算

集合的交运算使用【&】符号,集合的并运算使用【|】符号,集合的差运算使用【-】符号。这几种运算结果生成新的集合,对原有的集合不会造成任何影响。

1、集合的交运算

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = set1 & set2
print(set1)
print(set2)
print(set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Tom', 'Black', 'Jerry', 'John', 'White', 'Rose'}
{
    
    'Jerry', 'ZhangMing', 'LiuTao', 'Black'}
{
    
    'Jerry', 'Black'}

2、集合的并运算

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = set1 | set2
print(set1)
print(set2)
print(set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Tom', 'John', 'White', 'Jerry', 'Rose', 'Black'}
{
    
    'Jerry', 'LiuTao', 'Black', 'ZhangMing'}
{
    
    'LiuTao', 'Tom', 'White', 'John', 'ZhangMing', 'Jerry', 'Rose', 'Black'}

3、集合的差运算

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = set1 - set2
set4 = set2 - set1
print(set1)
print(set2)
print(set3)
print(set4)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
    
    'Jerry', 'John', 'Tom', 'Rose', 'Black', 'White'}
{
    
    'Jerry', 'LiuTao', 'ZhangMing', 'Black'}
{
    
    'Tom', 'Rose', 'John', 'White'}
{
    
    'LiuTao', 'ZhangMing'}

4、使用方法进行集合的并、交、差运算

(1)集合的交运算

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = set1.intersection(set2)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)
set1.intersection_update(set2)
print("set1:",set1)
print("set2:",set2)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: {
    
    'Jerry', 'Rose', 'Black', 'John', 'Tom', 'White'}
set2: {
    
    'Black', 'Jerry', 'ZhangMing', 'LiuTao'}
set3: {
    
    'Jerry', 'Black'}
set1: {
    
    'Jerry', 'Black'}
set2: {
    
    'Black', 'Jerry', 'ZhangMing', 'LiuTao'}

(2)集合的并运算

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = set1.union(set2)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: {
    
    'Tom', 'Black', 'Jerry', 'White', 'Rose', 'John'}
set2: {
    
    'Jerry', 'Black', 'LiuTao', 'ZhangMing'}
set3: {
    
    'Tom', 'Black', 'Jerry', 'ZhangMing', 'LiuTao', 'White', 'Rose', 'John'}

(3)集合的差运算

set1 = {
    
    "Tom","Jerry","John","Black","White","Rose"}
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = set1.difference(set2)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)
set1.difference_update(set2)
print("set1:",set1)
print("set2:",set2)

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: {
    
    'Jerry', 'John', 'Tom', 'Rose', 'Black', 'White'}
set2: {
    
    'Jerry', 'Black', 'ZhangMing', 'LiuTao'}
set3: {
    
    'White', 'Tom', 'Rose', 'John'}
set1: {
    
    'John', 'Tom', 'Rose', 'White'}
set2: {
    
    'Jerry', 'Black', 'ZhangMing', 'LiuTao'}

五、冻结集合

冻结集合只是 Python 集合(set)对象的一个不可变版本。set 可以随时修改集合的元素,但冻结集合的元素在创建后保持不变。因此,冻结集可以用作字典中的键或另一个集合的元素。和集合一样,它不是有序的(元素不可以索引)。

冻结集合的作用:

(1)在集合的关系中,有集合的中的元素是另一个集合的情况,但是普通集合(set)本身是可变的,那么它的实例就不能放在另一个集合中(set中的元素必须是不可变类型)。

(2)冻结集合提供了不可变的集合的功能,当集合不可变时,它就满足了作为集合中的元素的要求,就可以放在另一个集合中了。

使用 frozenset() 函数返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。frozenset() 函数的语法格式如下:

frozenset([iterable])

说明:
(1)参数 iterable 是可选的,不传入时会创建一个空的冻结集合,传入时由 iterable 中的元素初始化。
(2)参数 iterable 是一个可迭代对象(比如列表、字典、元组、字符串等),将此对象转为一个冻结集合。

例如:

set1 = frozenset()
set2 = {
    
    "Jerry","ZhangMing","Black","LiuTao"}
set3 = frozenset(set2)
set4 = frozenset([1,2,3,4])
print("set1:",set1)
print(type(set1))
print("set3:",set3)
print(type(set3))
print("set4:",set4)
print(type(set4))

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: frozenset()
<class 'frozenset'>
set3: frozenset({
    
    'LiuTao', 'Black', 'Jerry', 'ZhangMing'})
<class 'frozenset'>
set4: frozenset({
    
    1, 2, 3, 4})
<class 'frozenset'>

冻结集合为一个不可变、无序对象,不对对其进行增加、修改、排序、下标切取等操作,但它也具有集合的一些特性,可以进行并、交、差等集合操作。

例如:

set1 = frozenset({
    
    "Jerry","ZhangMing","Black","LiuTao"})
set2 = frozenset(["Tom","Jerry","Jack"])
set3 = set1 & set2
set4 = set1 | set2
set5 = set1 - set2
print("set1:",set1)
print(type(set1))
print("set2:",set2)
print(type(set2))
print("set3:",set3)
print(type(set3))
print("set4:",set4)
print(type(set4))
print("set5:",set5)
print(type(set5))

运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: frozenset({
    
    'LiuTao', 'Black', 'Jerry', 'ZhangMing'})
<class 'frozenset'>
set2: frozenset({
    
    'Tom', 'Jerry', 'Jack'})
<class 'frozenset'>
set3: frozenset({
    
    'Jerry'})
<class 'frozenset'>
set4: frozenset({
    
    'Tom', 'Jerry', 'ZhangMing', 'LiuTao', 'Black', 'Jack'})
<class 'frozenset'>
set5: frozenset({
    
    'LiuTao', 'Black', 'ZhangMing'})
<class 'frozenset'>

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/132131380