文章目录
- 第六章 组合数据类型
- 6.1 组合数据类型的基本概念
- 6.1.1 集合类型概述
- 6.1.2 序列类型概述
- 6.1.3 映射类型概述
- 6.2 列表类型
- 6.2.1 列表的定义
- 6.2.2 列表的索引
- 6.2.3 列表的切片
- 6.3 列表类型的操作
- 6.3.1 列表的操作函数
- 6.3.2 列表的操作方法
- 6.4 字典类型
- 6.4.1 字典的定义
- 6.4.2 字典的索引
- 6.5 字典类型的操作
- 6.5.1 字典的操作函数
- 6.5.2 字典的操作方法
- 6.6 实例解析——文本词频统计
- 习题6
- 一、选择题
- 二、编程题
第六章 组合数据类型
6.1 组合数据类型的基本概念
能够表示多个数据量的类型成为组合数据类型。Python语言中最常用的组合数据类型有3大类,分别是集合类型、序列类型和映射类型。
集合类型是一个具体的数据类型名称,而序列类型和映射类型是一类数据类型的总称。
集合类型是一个元素的集合,元素之间无序,相同元素在集合中唯一存在。
序列类型是一个元素向量,元素之间存在先后关系,通过序号访问,元素之间不排他。序列类型的典型代表是字符串类型和列表类型。
映射类型是“键—值”数据项的组合,每个元素是一个键值对,表示为(key,value)。映射类型的典型代表是字典类型。
6.1.1 集合类型概述
Python语言中的集合类型与数学中的集合概念一致,既包含0个或多个数据项的无序组合。集合是无序组合,用大括号({})表示,它没有索引和位置的概念,集合中元素可以动态增加或删除。
集合元素不可重复出现,元素类型只能是固定数据类型,例如:整数、浮点数、字符串、元组等,列表、字典和集合类型本身都是可变数据类型,不能作为集合的元素出现。
需要注意,由于集合元素是无序的,集合的打印效果与定义顺序可以不一致。由于集合元素独一无二,使用集合类型能够过滤重复元素。
集合类型有4个操作符:交集(&)、并集(|)、差集(-)、补集(^),操作逻辑与数学定义相同。
操作符的运算 | 描述 |
---|---|
S - T | 返回一个新集合,包括在集合S中但不在集合T中的元素 |
S & T | 返回一个新集合,包括同时在集合S和T中的元素 |
S ^ T | 返回一个新集合,包括集合S和T中非共同元素 |
S | T | 返回一个新集合,包括结婚S和T中所有元素 |
集合类型主要用于元素去重,适合于任何组合数据类型。集合类型常用的操作函数或方法:
函数或方法 | 描述 |
---|---|
S.add(x) | 如果数据项x不在集合S中,将x增加到s |
S.remove(x) | 如果x在集合S中,移除该元素,不再产生KeyError异常 |
S.clear() | 移除S中所有数据项 |
len(S) | 返回集合S元素个数 |
x in S | 如果x是S的元素,返回True,否则返回False |
x not in S | 如果x不是S的元素,返回True,否则返回False |
6.1.2 序列类型概述
序列类型是一维元素向量,元素之间存在先后关系,通过序号访问。
由于元素之间存在顺序关系,所以序列中可以存在相同数值但位置不同的元素。Python语言中有很多数据类型都是序列类型,其中比较重要的是:字符串类型、列表类型和元组类型。
字符串类型可以看成是单一字符的有序组合,属于序列类型。列表则是一个可以使用多种类型元素的序列类型。序列类型使用相同的索引体系,即正向递增序号和反向递减序号。
序列类型的操作符和函数:
操作符 | 描述 |
---|---|
x in S | 如果x是S的元素,返回True,否则返回False |
x not in S | 如果x不是S的元素,返回True,否则返回False |
s + t | 连接s和t |
s * n 或 n * s | 将序列s复制n次 |
s[i] | 索引,返回序列的第i个元素 |
s[i: j] | 切片,返回包含序列s第i到j个元素的子序列(不包含第j个元素) |
s[i: j:k] | 步骤切片,返回包含序列s第i到j个元素以k为步数的子序列 |
len(s) | 序列s的元素个数(长度) |
min(s) | 序列s中的最小元素 |
max(s) | 序列s中的最大元素 |
s.index(x) | 序列s中第一次出现元素x的位置 |
s.count(x) | 序列s中出现x的总次数 |
6.1.3 映射类型概述
映射类型“键—值”数据项的组合,每个元素是一个键值对,即元素是(key,value),元素之间是无序的。键值对(key,value)是一种二元关系,源于属性和值的映射关系。
映射类型是序列类型的一种扩展。在序列类型中,采用从0开始的正向递增序号进行具体元素值的索引。而映射类型则由用户来定义序号,即键,用其去索引具体的值。
键(key)表示一个属性,也可以理解为一个类别或项目,值(value)是属性的内容,键值对刻画了一个属性和它的值。键值对将映射关系结构化,用于存储和表达。
6.2 列表类型
6.2.1 列表的定义
列表是包含0个或多个元素的有序序列,属于序列类型。列表可以进行元素增加、删除、替换和查找等操作。列表没有长度限制,元素类型可以不同,不需要预定义长度。
列表类型用括号({})表示,也可以通过list(x)函数将集合或字符串转换成列表类型。
列表属于序列类型,所以列表类型支持序列类型对应的操作。
6.2.2 列表的索引
索引是列表的基本操作,用于获得列表的一个元素。使用中括号作为索引操作符。
可以使用遍历循环对列表类型的元素进行遍历操作,语法格式如下:
for <循环变量> in <列表变量>:<语句块>
6.2.3 列表的切片
切片是列表的基本操作,用于获得列表的一个片段,即获得一个或多个元素。切片后的结果也是列表类型。语法格式如下:
<列表或列表变量>[N:M] 或 <列表或列表变量>[N:M:K]
切片获取列表类型从N到M(不包含M)的元素组成新的列表。其中,N和M为列表类型的索引序号,可以混合使用正向递增序号和反向递减序号,一般要求N小于M,当N大于等于M时,返回空列表。当K存在时,切片获取类表类型从N到M(不包含M)以k为步长所对应元素组成的列表。
6.3 列表类型的操作
6.3.1 列表的操作函数
操作函数 | 描述 |
---|---|
len(ls) | 列表ls的元素个数(长度) |
min(ls) | 列表ls中的最小元素 |
max(ls) | 列表ls中的最大元素 |
list(x) | 将x转变成列表类型 |
6.3.2 列表的操作方法
列表类型存在一些操作方法,语法格式如下:
<列表变量>.<方法名称>(<方法参数>)
方法 | 描述 |
---|---|
ls.append() | 在列表ls最后增加一个元素x |
ls.insert(i,x) | 在列表ls第i位置增加元素x |
ls.clear() | 删除ls中所有元素 |
ls.pop(i) | 将列表ls中第i项元素取出并删除该元素 |
ls.remove(x) | 将列表中出现的第一个元素x删除 |
ls.reverse() | 列表ls中元素反转 |
ls.copy() | 生成一个新列表,复制ls中所有元素 |
del <列表变量>[<索引序号>] del <列表变量>[<索引起始>:<索引结束>] | 对列表元素或片段进行删除 |
6.4 字典类型
6.4.1 字典的定义
“键值对”是组织数据的一种重要方式,广泛应用在Web系统中。键值对的基本思想是将“值”信息关联一个“键”信息,进而通过键信息查找对应值信息,这个过程叫映射。Python语言中通过字典类型实现映射。
Python语言中的字典使用大括号{}建立,每个元素是一个键值对,语法格式如下:
{<键1>:<值1>, <键2>:<值2>, ……, <键n>:<值n>}
其中,键和值通过冒号连接,不同键值对通过逗号隔开。字典类型也具有和集合类似的性质,即键值对之间没有顺序且不能重复。
6.4.2 字典的索引
索引是按照一定顺序检索内容的体系。列表类型采用元素顺序的位置进行索引。由于字典元素“键值对”中键是值的索引,因此,可以直接利用键值对关系索引元素。字典是存储可变量键值对的数据结构,键和值可以是任意数据类型,通过键索引值,并可以通过键修改值。
字典中键值对的索引语法格式如下,采用中括号格式:
<值> = <字典变量>[<键>]
利用索引和赋值(=)配合,可以对字典中每个元素进行修改。
d = {"201801": "小明", "201803": "小白"}
d["201802"] = "小红"
print(d)# 运行结果
{'201801': '小明', '201803': '小白', '201802': '小红'}
使用带括号可以创建字典。通过索引和赋值配合,可以向字典中增加元素。
d = {}
d["201802"] = "小红"
print(d)# 运行结果
{'201802': '小红'}
6.5 字典类型的操作
6.5.1 字典的操作函数
操作函数 | 描述 |
---|---|
len(d) | 字典d的元素个数(长度) |
min(d) | 字典d中键的最小值 |
max(d) | 字典d中键的最大值 |
dict() | 生成一个空字典 |
6.5.2 字典的操作方法
字典类型存在一些操作方法,语法格式如下:
操作方法 | 描述 |
---|---|
d,keys() | 返回所有的键信息 |
d.values() | 返回所有的值信息 |
d.items() | 返回所有的键值对 |
d.get(key,default) | 键存在则返回相应值,否则返回默认值 |
d.pop(key,default) | 键存在则返回相应值,同时删除键值对,否则返回默认值 |
d.popitem() | 随即从字典中取出一个键值对,以元组(key, value)形式返回 |
d.clear() | 删除所有的键值对 |
del d{“键”} | 删除字典中元素 |
与其他组合类型一样,字典可以遍历对其元素进行遍历,语法格式如下:
for <变量名> in <字典名>:<语句块>
for循环返回的变量名是字典的索引值。如果需要获得键对应的值,可以在语句开中通过get()方法获得。
d = {"201801": "小明", "201803": "小白", "201802": "小红"}
for i in d:print(f"字典的键:{i}\t\t值:{d.get(i)}")# 运行结果
字典的键:201801 值:小明
字典的键:201803 值:小白
字典的键:201802 值:小红
6.6 实例解析——文本词频统计
def getText():txt = open("hamlet.txt", "r").read()txt = txt.lower()for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':txt = txt.replace(ch, " ") # 将文本中特殊字符替换为空格return txthamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(10):word, count = items[i]print("{0:<10}{1:>5}".format(word, count))# 运行结果
the 1138
and 965
to 754
of 669
you 550
i 542
a 542
my 514
hamlet 462
in 436
习题6
一、选择题
-
以下程序的输出结果是:_________
names = ['小明', '小红', '小白', '小新'] if '小明朋友' in names:print('存在') else:print('不存在')
A 存在 B 不存在 C 程序错误 D 不确定
正确答案:B
-
以下创建字典方式错误的是:_________
A d = {1:[1,2], 3:[3,4]} B d = {[1,2]:1, [3,4]:3}C d = {(1,2):1, (3,4):3} D d = {1:‘张三’, 3:‘李四’}
正确答案:B
-
以下说法中错误的是:_________
A 浮点数0.0等于False,条件判断为假
B 空字典对象不等于False,条件判断为真
C 值为0的任何数字类型元素相当于False,条件判断为假
D 空字符串对象相当于False,条件判断为假
正确答案:B
-
以下程序的输出结果为:_________
nums = [1, 2, 3, 4] nums.append([5, 6, 7, 8]) print(len(nums))
A 4 B 5 C 8 D 以上都不对
正确答案:B
-
以下选项中不能创建一个字典的是:_________
A d = {[1,2,3]:‘Python’} B d = {}
C d = {(1,2,3):‘Python’} D d = {3 : 5}
正确答案:A
-
以下程序的输出结果是:_________
d = {'1': 1, '2': 2, '3': 3, '4': 4} d2 = d d['2'] = 5 print(d['2'] + d2['2'])
A 2 B 5 C 7 D 10
正确答案:D
-
以下数据类型属于不可变化类型的是:_________
A 列表 B 复数 C 字典 D 元组
正确答案:D
-
将一个字典的内容添加到另外一个字典中的方法是:_________
A update() B keys() C items() D get()正确答案:A
-
列表类型中pop()的功能是:_________
A 删除列表中第一个元素 B 返回并删除列表中第一个元素
C 删除列表中最后一个元素 D 返回并删除列表中最后一个元素
正确答案:D
-
a和b是两个列表,将它们的内容合并为列表c的方法是:_________
A c = a.update(b) B a.update(b) C c = [a, b] D c = a + b
正确答案:D
二、编程题
-
英文字符频率统计。
# 编写一个程序,对给定字符串中出现的a-z字母频率进行分析,忽略大小写,采用降序方式输出。 text = input("请输入一个字符串:") dic = {} for c in text.lower():if c.isalpha():dic[c] = dic.get(c, 0) + 1 freq_sorted = sorted(dic.items(), key=lambda x: x[1], reverse=True) for item in freq_sorted:print(item[0], item[1])
-
中文字符频率统计。
# 编写一个程序,对给定的字符中出现的全部字符(含中文字符)频率进行分析,采用降序方式输出 text = input("请输入一个字符串:") dic = {} for c in text:dic[c] = dic.get(c, 0) + 1 freq_sorted = sorted(dic.items(), key=lambda x: x[1], reverse=True) for item in freq_sorted:print(item[0], item[1])
-
随机密码生成。
# 编写程序在26个字母大小写和9个数字组成的列表中随机生成10个8位密码 import random import stringcharacters = string.ascii_letters + string.digits # 生成26个字母大小写和9个数字组成的字符列表passwords = [] for i in range(10):password = ''.join(random.sample(characters, 8))passwords.append(password)# 随机生成8位密码,将密码添加到列表中for password in passwords:print(password)# 输出生成的10个密码
-
重复元素判定。
# 编写一个函数,接收列表作为参数,如果一个元素在列表中出现了不止一次,则返回True,但不要改变原来列表的值。同时编写调用这个函数和输出测试结果的程序 def check_duplicate(lst):for item in lst:if lst.count(item) > 1:return Truereturn Falselst = list(input("请输入一段内容:")) print(f"{check_duplicate(lst)}")
-
重复元素判定续。
# 利用集合的无重复性改变上一个程序,获得一个更快更简洁的版本 def check_duplicate(lst):return len(set(lst)) != len(lst)lst = list(input("请输入一段内容:")) print(f"{check_duplicate(lst)}")