python编程入门之十:集合

第十章:【集合】

“集合!”是我们上学军训时最不想听到的口号,同时“集合”也是我们学习数学中的小噩梦;它,既可以是动词,也可以是名词,更是python中不可或缺的“数据类型”。到本章为止,我们已经讲过很多“数据类型”了,那么不妨我们来对几个“数据类型”的“封装符号”来复习一下:

#字符串:
str1 = "123"
str2 = '123'

#列表:
list1 = [1,2,3]

#元组:
tuple1 = (1,2,3)

#字典:
dict1 = {'a':'A','b':'B','c':'C'}

通过复习我们发现,单双引号、小括号、中括号以及大括号全部被之前的几个“数据类型”占用了,那么我们接下来要学习的【集合】还能用什么符号呢?

10.1初识【集合】

大括号!对,你没看错,还是大括号:“{ }”,【集合】使用的“符号”与字典是一样的,那么我们不妨先来简单了解一下【集合】:

set1 = {1,2,3}

print(type(set1))
print(set1)

结果:

<class 'set'>
{1, 2, 3}

代码证实,在定义【集合】时,同样使用的是大括号“{ }”,并且通过type方法也证实了‘set1’的确是一种【集合】:set(set经常做动词:设置;在这里做名词:集合);但是我们不禁产生了疑问,像列表、元组这样的可以存放一系列元素的“数据类型”多得是,那么【集合】有什么优势呢?问得好,接下来我们再看一条代码:

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

set2 = {1,2,3,2,1,0}
print(set2)

结果:

{1, 2, 3}

{0, 1, 2, 3}

对比一下,有没有看出问题?我们在给set1赋值时,它把我们给予的“1、2、3”按照原样进行输出了,但是我们给‘set2’赋的值,它却帮我们进行了两个处理:
1.去重:去掉了重复的元素;
2.排序:将元素按数字从小到大进行排序,那字符串呢?随缘,令我们意想不到的是,字符串的排序并不会按照ASCII码等合理方式排序,而真的是随机的。。。如果不信可以试一下。

没错,这两个就是【集合】的优势,优势在哪?我们举一个例子:我们需要将一个包含重复元素的列表进行排序,如果采用列表的一些方法的话会比较麻烦:

list1 = [1,2,3,3,4,4,2,1,0]
list2 = list1.copy()        #复制一个新的列表
list1.clear()               #清空list1
for i in list2:             #对list2进行遍历
    if i not in list1:      #如果list1里没有相同的元素
        list1.append(i)     #向list1追加元素
print(list1)

结果:

[1, 2, 3, 4, 0]

但是我们如果借助【集合】来帮我们完成去重:

list1 = [1,2,3,3,4,4,2,1,0]
list1 = list(set(list1))
print(list1)

结果:

[0, 1, 2, 3, 4]

就是这么方便、这么任性,通过强制类型转化为【集合】,可以很方便的实现去重及排序的效果,但也一定要注意,【集合】的去重和排序是同时存在的,不会根据我们的需求只实现去重或只实现排序,牢记!

10.2创建集合的几种方式

同列表、元组、字典等一样,创建【集合】的方式也有多种,当然最简单的是直接赋值的方式:

set1 = {'a',b','c'}

当然也可以使用set()方法进行创建:

set2 = set(['a','b','c'])

当然还有一种方式可以帮我们创建一个【不可变集合】,需要使用frozenset()方法,“frozen”这个单词想必都见过:“v. 冰冻”,也就是创建一个“冰冻”的【集合】:

set3 = frozenset(['a','b','c'])

通过“frozen()”创建的【集合】是不可改变的,像是列表、元组等都有“增删改查”,【集合】也是有的,但是这些更改方式在“frozenset”的【集合】是无法使用的,那接下来我们先看一下【集合】的几种常见的方法。

10.3【集合】的几种常见方法

1.访问【集合】

在讲【集合】的方法前,我们先看一下【集合】是怎样进行访问的?我们知道如果是访问列表的话,很简单:

list1 = [1,2,3]
list1[2]

可以直接采用列表名+[下标]的方式进行访问,但这种访问方式在【集合】里是不适用的,因为【集合】的元素是“无序”的,你可能很奇怪,不是说【集合】可以进行排序的吗?怎么这里又说【集合】是无序的呢?其实这没什么纠结的,排序只是【集合】的功能,而无序则是【集合】的性质,像是如下集合:

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

结果:

{1,2,3,4,5}

我们可以看到输出的这个集合貌似是有序的,那不妨我们把数字全部改成字母试一下:

set2 = {'a','b','c','d'}
print(set2)

结果:

#结果一
{'c', 'd', 'a', 'b'}

#结果二
{'d', 'a', 'c', 'b'}

#结果三
{'c', 'd', 'b', 'a'}

#结果。。。

看到没有,多运行几次代码发现,同一个【集合】,却输出了不同的顺序,而且尽管顺序不同,它依旧是一个唯一的集合;因此如果想要访问这么一种无序的【集合】,并没有那么简单了,同样需要用到for循环遍历的方法:

set2 = {'a','b','c','d'}
for each in set2:
    print(each,end=" ")

结果:

c b d a 

2.添加元素的方法–add()

虽然【集合】是无序的,但也不会影响到向【集合】增加元素的方法–add():

set1 = {1,2,3,4}
set1.add('e')
print(set1)

结果:

{1, 2, 3, 4, 'e'}

并且通过结果我们可以分析到,数字、字符串是可以在一个【集合】里并存的,并且数字的优先级高于字符串(注意:元组也可以放入集合,但是列表及字典是不可以的)。

3.删除元素的方法–remove()

既然add可以增加元素,那么自然而然remove就是用来删除元素的:

set1 = {1,2,3,4}
set1.remove(3)
print(set1)

结果:

{1, 2, 4}

而且只能删除我们已知的元素,如果删除一个不存在的元素就会出错:

set1 = {1,2,3,4}
set1.remove(5)
print(set1)

结果:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    set1.remove(5)
KeyError: 5

另外,再回顾一下我们上面说的使用frozenset来创建一个【不可变集合】的方式,如果使用add或是remove会出现什么结果呢?不妨试一下:

set1 = frozenset([1,2,3])
set1.add(4)

结果:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    set1.add(4)
AttributeError: 'frozenset' object has no attribute 'add'

很显然,通过frozenset创建的【集合】的确是不可变的。

10.4更多【集合】的方法

当然,【集合】所包含的方法也有很多,但这里不一一详细的讲解了,我们首先可以在pycharm里,输入“set”然后使用“Ctrl”+鼠标左击的方式查看它的“builtins”文档,绝对官方;当然我也对一些不算冷门的方法简单的做了整理:

方法名 作用
clear() 从该集合中删除所有元素
copy() 返回集合的浅复制副本(关于浅复制请查看相应博客)
difference() 将两个或多个集合的差值作为新集合返回
difference_update() 从该集合中删除另一个集合的所有元素
discard() 如果集合中有该元素,则将其删除。如果没有,则什么都不做
intersection() 将两个集合的交集作为新集合返回
intersection_update() 用自己和另一个的交集更新一个集
isdisjoint() 如果两个集合的交点为空,则返回True
issubset() 报告另一组是否包含该组
issuperset() 报告此集合是否包含另一个集合
pop() 删除并返回任意set元素。如果集合为空,则引发KeyError
symmetric_difference() 将两个集合的对称差作为新集合返回
symmetric_difference_update() 用本身和另一个的对称差异更新一个集合
union() 将集合的并集作为新集合返回
update() 用自身和其他元素的并集更新集合
posted @ 2020-05-26 17:18  洪博hopes  阅读(166)  评论(0)    收藏  举报