2023年11月2日·16 min read

Python计算机二级(五)

组合数据类型(集合、列表、字典)的知识点整理。

这篇文章距离上一篇Python计算机二级(4.5) - 知乎 (zhihu.com)已经有8个月了。 当时觉得没人看也没人点赞,当时其实是有点抑郁的,于是决定弃坑 但是直到今天,有人在这个系列的文章下评论了 我终于意识到,我不能弃坑,必须要写下去!

开始吧!

我们先来看看我们这一章要学什么:

五、组合数据类型 1、组合数据类型的基本概念; 2、列表类型:定义、索引、切片; 3、列表类型的操作:列表的操作函数、列表的操作方法; 4、字典类型:定义、索引; 5、字典类型的操作:字典的操作函数、字典的操作方法。 嗯,还行。

什么是组合?

我先来问问大家,什么是组合? 根据中文语法和生活实际,组合组合嘛,就是把一堆东西组合起来的东西,就是“组合”。 比如说装了苹果的一个筐子,就是一个“组合” 这也就说明了组合的这几个要素:

  1. 组合就是一个可以装东西的筐子
  2. 组合里的东西一定是可数的 来看看这些组合:

1.集合

集合就是一个大袋子,你不知道谁是第一个装的,也不知道谁是最后一个装的。所以集合是无序的。 那么在python中又是怎么表示的呢:

a = {1,1,1,"asdf"}

我们可以用一个大括号把里面的东西括起来,然后将里面的这一堆东西用逗号隔开。 请各位想想,在中学的数学课本里是不是也讲过一个类似的内容——都是无序的,甚至名字还很像 对,那个东西也叫”集合“ 那么,python中的集合跟数学教材里的集合是不是一个东西呢?我们先来用print函数看看我们这个集合里有什么东西:

print(a)
 
output : 
{1, 'asdf'}

怎么数据跟我定义的不一样呢?对了,数学里的集合说是里面的元素不能重复。 python里的集合也是如此。 那么既然这样,会不会python里的集合也会有并集,交集这些? 你还别说,还真有:

S = {1,2,3,4,5}
T = {4,5,6,7,8}
print(S-T)
print(S|T)
print(S&T)
print(S^T)
 
output:
{1, 2, 3}
{1, 2, 3, 4, 5, 6, 7, 8}
{4, 5}
{1, 2, 3, 6, 7, 8}

我们来依次看一下这四个符号都是什么意思 第一个输出了S有的但是T没有的(就是用T去抹除了S,T有的都没了,T没有的还在) 第二个输出了S跟T都有的部分(就是把两个集合都合并起来,但是因为集合不能有重复的,于是删掉了一些重复元素) 第三个输出了S跟T都有的部分 第四个······我这里用符号表示一下,看你能不能看的明白:(S|T)-(S&T) 我估计现在你们有点晕晕的,没事,我们来看图,图能说明一切: 别人的,zhuanlan.zhihu.com/p/351740958,感谢大佬赐图 我们说到,集合是一个筐子,那么,这个筐子有没有使用它的方法呢?

# add添加S = {1,2,3,4,5}
S.add("asdf")
print(S)
 
output:
{1, 2, 3, 4, 5, 'asdf'}
 
# remove删除S.remove(1)
print(S)
 
output:
{2, 3, 4, 5, 'asdf'}
 
#clear清空S.clear()
print(S)
 
output:
set() #代表这个是空的集合# 看某个值是否在集合中S = {1,2,3,4,5}
print(1 in S)
print(1 not in S)
 
output:
TrueFalse#len 长度print(len(S))
 
output:
5

2.列表

列表,顾名思义就是一列的东西,那这个东西就可以数出来某个物品是在第几个了 我们通常使用[]来表示一个列表,同样的,使用逗号来隔断各个元素。

a = [1,1,1,1,1,1]
print(a)
 
output:
[1,1,1,1,1,1]

那么,既然说列表可以将物品的位置数出来,那么同样的,当我们需要某个物品时我们也可以通过描述那个物品的序号来获取那个东西,就比如说:

小py,帮我把这个列表里的第n个东西给拿过来 python就可以帮你把这个东西拿过来,但是python又不会汉语,我们翻译一下:

a = [1,2,3,4,5]
b = a[1]
c = a[-2]
print(b)
 
output:
2
4

我们可以通过写a[n]来表示我们要的元素。 但是python这人不聪明,你说是第1个,结果python给你拿了第二个

当然你也可以搜一下为什么python脑子这么烂[doge]。 所以我们可以得出: a[n-1]#获取第n个元素 那-2又表示什么呢?答案是倒数第二个。 你想想嘛,当我有一个装了好多好多东西的列表时,我自己都数不过来里面有多少东西时,我就会说,小py,帮我拿倒数第二个来。 现在我们来讲一讲列表的另一个操作,切片。 什么是切片? 还是一样的,用汉字的方法来讲,切片切片,就是切完的片。 就比如说现在有一个列表[1,2,3,4,5]。我想只拿4跟5,那么如果是按照上面找序列的方法,把4跟5取出,再放到一个新的容器里。 但是你有没有发现,我取出存入的方法,不就是先切成5份,再把两份拿走,再装到一个新的容器里? 为什么不能就切成两份,然后把我要的那一份抱手里给放到新的容器里呢? 这就是切片。 切片有以下这几种形式:

a = [1,2,3,4,5]
b = a[2:]
c = a[:2]
d = a[1:2]
e = a[1:-2]
 
print(b)
print(c)
print(d)
print(e)
 
output:
[3, 4, 5]
[1, 2]
[2]
[2, 3]

是不是看懵了?我学的时候也是。 既然你知道了切片的原理,那么我们现在画个图:

'''
eg : d = a[1:2] 用|来表示切刀的位置
 
序号 : 0 | 1 | 2  3  4
元素 : 1 | 2 | 3  4  5
最后的元素 : 2(就是两把切刀的中间那一部分)
'''

现在你懂了吧。 切刀总是在序列的前面,切片的内容就在两把切刀的中间,而[1:2]的意思就是两把切刀,一把在序列1的前面,一把在2的前面,:用来表示选取的内容 那剩下的东西呢,比如说 b = a[2:] c = a[:2] 这些 一般来说,有时候切刀不需要两把,当我需要从第2个选取到最后一个的时候我只需要一把切刀,那么我只需要告诉python那把切刀的位置就行了。 前面我也讲过,:用来表示选取的内容。所以我们现在可以来翻译一下b和c b表示从序列2到最后一个,c表示从第一个到2序号前那一个。 使用数学方法来表示的话就是:选取一堆元素满足在序号[n,j)中,也就是满足在第n+1到第j个。

3.列表类型的操作

前面我们讲到了列表,那么,列表有什么操作方法吗? 更改: 我们可以用list[n] = newValue来修改在序列为n的值。 添加:

list = [1,2,3,4,5]
list.append("A")
print(list)
 
output:
[1, 2, 3, 4, 5, 'A']

append方法传入一个值,然后将值放到最后一个的后面 既然可以放到最后一个,那么也可以放到其他的任意一个点了: 插入:

list = [1,2,3,4,5]
list.insert(1,"123")
print(list)
 
output:
[1, '123', 2, 3, 4, 5]

insert()有两个参数,第一个表示要插入的位置序列,第二个表示要插入的值。 就比如说list.insert(1,"123"),表示把值"123"放在序号1上。 向后添加一个列表:

list = [1,2,3,4,5]
a = ["123123","456456"]
list.extend(a)
print(list)
 
output:
[1, 2, 3, 4, 5, '123123', '456456']

extend函数传入一个列表,并且将传入的列表全部放到其后面。 其实我们也可以写一个:

def EXTEND(a : list,b : list):
    for i in b:
        a.append(i)
    return a

删除: 删除分为两种删除,根据元素删除 和 根据序列号删除

list = [1,2,3,4,5]
list.remove(1)
print(list)
list.pop(1)
print(list)
 
output:
[2, 3, 4, 5]
[2, 4, 5]

remove函数传入一个值,然后再找寻有没有跟这个值相同的元素,如果有,就删除,如果没有就报错。比如下面这个例子:

list = [1,2,3,4,5]
list.remove(6)
 
error:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
      1 list = [1,2,3,4,5]
----> 2 list.remove(6)
 
ValueError: list.remove(x): x not in list

ValueError告诉了我们x不在这个列表中。 那么,要是有好多个值呢?python就会删掉第一个与传入值相同的值。我在这里就不演示了,不过希望你们可以自己试一试。 pop函数就很简单了,其传入一个数字,并删除这个值所代表的东西。 清除: 使用clear(),会将这个列表里的东西全部清空。 查询: index(data),里面传入你希望查询的值(data),然后就会给你它的位置。 统计数量: count(data),传入查询值(data),传出这个值出现了多少次。

4.字典

我最开始学python的时候,第一次看到这个词我人是傻的。当时我以为可以用这个东西进行翻译,然后就很认真的学了。最后发现,跟我们所讲的那个字典不是一个东西。 但是我们如果真要实现一个字典的话,列表又只能通过其序列才行。我们还要去翻半天才能找到“一”的序号,然后又要翻半天才能找到那个东西。 太麻烦了。 回想一下,我们如果要在字典里查“一”这个子,我们通常是不是会使用拼音来查询,当然还有好多种方法来查询。 但是总结出来就一种方法——通过查询关键字来查找。 那么,怎么样才能实现一个可以通过查询关键字就可以找到对应的值的组合呢? 我们其实只要改一下列表就行了。列表中每个值都有对应的序列号,那么我们也可以建立一个组合,其元素形如: keyword : value 每个元素包含一个关键词跟其对应的值。 这就是python里的字典。

dic = {'asdf':1,'ghjk':1234}
print(dic)
 
output:
{'asdf': 1, 'ghjk': 1234}

我们使用{}把各个元素包含起来,然后用逗号来隔开每个元素 元素按照我上面那么写,也就是 keyword : value ,这种元素我们常常叫“键对值” 我们要找到值也很简单,跟列表一样,使用dic[keyword]来表示。

dic = {'asdf':1,'ghjk':1234}
print(dic['asdf'])
 
output:
1

5.字典类型的操作

当我们想新增一个键对值时,我们可以这样:

dic = {'asdf':1,'ghjk':1234}
dic["asdfasdf"] = 123
print(dic)
 
output:
{'asdf': 1, 'ghjk': 1234, 'asdfasdf': 123}

如果我们想修改值的话我们也可以直接dic[keyword] = newValue这样来,跟列表一样的。 注意,我们不能去修改关键字! 删除: 我们使用pop(key),key代表其值对应的关键字。

dic = {'asdf':1,'ghjk':1234}
dic.pop("asdf")
print(dic)
 
output:
{'ghjk': 1234}

当然我们也可以使用del 指令来删除:

dic = {'asdf':1,'ghjk':1234}
del dic["asdf"]
print(dic)
 
output:
{'ghjk': 1234}

获取键对值列表、关键字列表、值列表 我们可以用items(),keys(),values()来得到一个有序组合,但是这个有序组合不能用[]来查询,只能用来遍历,这就意味着这三个组合是不能进行更改的。

dic = {'asdf':1,'ghjk':1234}
print(dic.items())
print(dic.keys())
print(dic.values())
for i,j in dic.items():
    print("key:",i," value:",j)
for i in dic.keys():
    print("key:",i)
for i in dic.values():
    print("value:",i)
 
output:
dict_items([('asdf', 1), ('ghjk', 1234)])
dict_keys(['asdf', 'ghjk'])
dict_values([1, 1234])
key: asdf  value: 1
key: ghjk  value: 1234
key: asdf
key: ghjk
value: 1
value: 1234

下一章

哇塞,不知不觉就已经写了5881个字了。

先来看看我们这一章的内容

我们讲到了组合,并提到了三种组合及其操作方法。 这么一听这一章还挺简单的啊。

看看下一章讲什么

六、文件和数据格式化 1、文件的使用:文件打开、读写和关闭; 2、数据组织的维度:一维数据和二维数据; 3、一维数据的处理:表示、存储和处理; 4、二维数据的处理:表示、存储和处理; 5、采用CSV格式对一二维数据文件的读写 快结束了...... 就剩下两章了 最后还是希望各位能看完这章后写写代码,把这章的内容复现一下