Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 43

Python 程序设计

Python Programming

第 6 章 组合数据类型
第 6 章 Python 的组合数据类型

本章学习目标:
 了解 3 类基本组合数据类型
 理解列表的概念并掌握 python 中列表的使用
 列表
 元组
 理解字典的概念并掌握 python 中字典的使字典
 运用列表管理采集的信息,构建数据结构
 运用字典处理复杂的数据信息
 运用组合数据类型进行文本词频统计
基本数据类型

Python3 中有六个标准的数据类型:
 Numbers (数字类型)
 Strings (字符串类型 str )
 Lists (列表类型 list )
 Tuples (元组类型 tuple )
 Dictionaries (字典类型 dict )
 Sets (集合类型 set )
6.1 组合数据类型概述

要点:组合数据类型能够将多个同类型或不同类型的数据组织起来,通过
单一的表示使数据操作更有序更容易。根据数据之间的关系,组合数据类
型可以分为三类:
• 序列类型、集合类型和映射类型。

• 序列类型是一个元素向量,元素之间存在先后关系,通过序号访问,元素
之间不排他。
• 集合类型是一个元素集合,元素之间无序,相同元素在集合中唯一存在。
• 映射类型是“键 - 值”数据项的组合,每个元素是一个键值对,表示为
(key,value) 。
6.1.1 序列类型

序列类型是一维元素向量,元素之间存在先后关系,通过序号访问。
其基本思想和表示方法来源于数学概念。
S=s0,s1,s2………….sn-1
6.1.1 序列类型

• 序列类型包括列表、元组和字符串等三种。
• 序列类型支持成员关系操作符 (in) 、分片运算符 ([ ]) , len( ), 序列中的元素也
还可以是序列类型。
• 单一字符串只表达一个含义,也被看作是基本数据类型。
• 元组 ( ) 是包含 0 个或多个数据项的不可变序列类型。元组生成后是固定的,其
中任何数据项不能替换或删除。
• 列表 [ ] 则是一个可以修改数据项的序列类型,使用也最灵活。
序列类型的通用操作符和函数

操作符或函数 功能描述
x in s 如果 x 是 s 的元素返回 True ,否则返回 False
x not in s 如果 x 不是 s 的元素返回 True ,否则返回 False
s+t 返回 s 和 t 的连接
s*n 将序列 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 中的最大元素
元组类型( tuple )
• 元组( tuple )与列表类似,也是一种序列数据类型。
• 元组是不可变类型,其元素不能修改。
• 元组中的元素是有序可重复的
• 元组中元素类型可以不相同。
• 元组写在小括号 ( ) 里,元素之间用逗号 , 隔开。
例如:

元组只有一个
元素,末尾也
需要加逗号。
元组类型( tuple )的使用

• 函数的多返回值
• 多变量同步赋值
• 循环的遍历
例如:
3)
1 ) def fun(x,y):

return x+y,x-y;
2)>>>a,b="dog","tiger"
>>>a,b=b,a
• tuple 与 list 之间的转换
6.1.2 集合类型

• 集合( set) 与数学中集合的概念一致,是 0 个或多个数据的无序组合,元


素不可重复。 ( 去重处理 )
• 元素类型只能是固定类型(整数,浮点数,字符串,元组等)
• 集合数无序组合,所以没有索引和位置的概念,不能分片,可以增加或删除。
• 用 { } 表示,用 set(x) 函数生成集合。
• 例如:
>>> S={425,”bit”,(10,”cs”),424}
{424,425,(10, “cs”),”bit”}
>>>W=set(“apple”)
{‘a’,’p’,’l’,’e’}
>>>v=set((“cat”,”dog”,”tiger”,”human”))
{“cat”,”dog”,”tiger”,”human”}
集合类型操作符和函数、方法
集合类型操作举例

• 举例如下:
集合的处理方法
集合的使用

• 集合主要用于 3 个场景:
• 成员测试、元素去重、删除数据项。如:

## 将元组转化为集合,也就达到去重的目的

## 将集合转化为元组
6.1.3 映射类型(字典类型 )

- 映射是一种键 ( 索引 ) 和值 ( 数据 ) 的对应

键( key )表示属性,也可以理解为一个类别或项目。
值( value) 是属性的内容。
键值对刻画了一个属性和值,键值对经映射关系结构化,用于存储和表达。
6.2 列表类型和操作 ( 重点)

列表里第一个元素的“位置”或者“索引”是从“ 0” 开始,第二个元
素的则是“ 1” ,以此类推。
在创建列表时,列表元素放置在方括号 [ ] 中,以逗号来分隔各元素,
格式如下:列表没有长度限制可以自由增删元素。
listname = [ 元素 1, 元素 2, 元素 3, ……, 元素 n]
sample_list1 = [0, 1, 2, 3, 4]
sample_list2 = ["P", "y", "t", "h", "o", "n"]
sample_list3 = ['Python', 'sample', 'list', 'for', 'your', 'reference']

sample_list5 = [sample_list1, sample_list2, sample_list3]


可以 list() 函数将 元组或字符串转化为列表。
>>>list(“ 中国是一个伟大的国家” )
5.1 列表
使用列表
通过使用“位置”或者“索引”来访问列表中的值,将放在方括号中。
特别注意 :“ 位置”或者“索引”是从 0 开始,负数意为从列表的右侧开始。
例如引用上一节列表示例 sample_list1 中的第 1 个,可以写成:
sample_list1[0] ;引用第 3 个值,可以写成: sample_list1[2] 。代码示例
为:
>>> sample_list1 = [0, 1, 2, 3, 4]
>>> print ("sample_list1[0]: ", sample_list1[0]) # 输出索引为 0 的元素
sample_list1[0]: 0
>>> print ("sample_list1[2]: ", sample_list1[2]) # 输出索引为 2 的元素
sample_list1[2]:
>>> 2
print ("sample_list1[-2]: ", sample_list1[-2]) # 输出索引倒数第 2 的元素
sample_list1[-2]: 3
>>> print ("sample_list2[2:4]:", sample_list2[2:4])
sample_list2[2:4]: ['t', 'h']
列表的修改

对列表的元素进行修改时,可以使用赋值语句:
>>> sample_list3 = ['python', 'sample', 'list', 'for', 'your', 'reference']
>>> sample_list3[4] = ‘my‘
>>> print ("sample_list3[4]:", sample_list3[4])
sample_list3[4]: my
>>> print ("sample_list3:", sample_list3)
sample_list3: ['python', 'sample', 'list', 'for', 'my', 'reference']

注意: 字符串里的字符不可以用这种方式修

元组可以用这种方式
修改元素么?
×
使用列表

# 初始化 3 个列表
>>> lst2=["python", 12, 2.71828, [0,0], 12]
>>> lst3=[21, 10, 55, 100, 2]
>>> lst=['aaa','bbb']
>>> lst2[2]=3.14 # 替换元素 ['python', 12, 3.14, [0, 0], 12]
>>> lst2[0:3]=lst #['aaa', 'bbb', [0, 0], 12]
# 追加(合并)列表
>>> lst2+=lst3 #['aaa', 'bbb', [0, 0], 12, 21, 10, 55, 100, 2]
>>> del lst2[:3] # 删除 0 , 1 , 2 等 3 个列表元素
删除列表元素

删除列表的元素,可以使用 del 语句,格式为:


del 列表名 [ 索引号 ]
该索引的元素被删除后,后面的元素将会自动移动并填补该位置。
在不知道或不关心元素的索引时,可以使用列表内置方法 remove()
来删除指定的值,例如:
listname.remove( 值 )

清空列表,可以采用重新创建一个与原列表名相同的空列表的方法,
例如:
listname = []

删除整个列表,也可以使用 del 语句,格式为:


del listname
删除列表元素
>>> sample_list4 = [0, "y", 2, "h", 4, "n", 'Python']
>>> del sample_list4[5] # 删除列表中索引为 5 的元素
>>> print ("after deletion, sample_list4: ", sample_list4)
after deletion, sample_list4: [0, 'y', 2, 'h', 4, 'Python']
>>> sample_list4.remove('Python') # 删除列表中值为 Python 的元素
>>> print ("after removing, sample_list4: ", sample_list4)
after removing, sample_list4: [0, 'y', 2, 'h', 4]
>>> sample_list4 = [] # 重新创建列表并置为空
>>> print (sample_list4) # 输出该列表
[]
>>> del sample_list4 # 删除整个列表
>>> print (sample_list4) # 打印输出整个列表
Traceback (most recent call last):
File "<pyshell#108>", line 1, in <module>
print (sample_list4)
NameError: name 'sample_list4' is not defined # 系统报告该列表未定义
4.1 列表
列表的内置函数与其他方法

代码示例如下:
>>> sample_list1 = [0, 1, 2, 3, 4]
>>> len(sample_list1) # 列表的元素数量
5
>>> max(sample_list1) # 列表中元素的最大值
4
>>> min(sample_list1) # 列表中元素的最小值
0
列表类型特有的函数或方法
方法 说明
listname.append( 元素 ) 添加新的元素在列表末尾
listname.count( 元素 ) 统计该元素在列表中出现的次数
listname.extend( lt ) 将列表 lt 追加到原列表中
listname.index( 元素 ) 从列表中找出某个值第一个匹配元素的索引位置
listname.insert( 位置 , 元素 ) 将元素插入列表指定位置
listname.pop ( i ) 移除列表中第 i 项元素,并且返回该元素的值
listname.remove(x) 移除列表中出现的第一个元素 x 删除
listname.reverse() 将列表中元素反向
listname.sort(cmp=None,
key=None, reverse=False) 对列表进行排序

listname.clear() 清空列表
listname.copy() 复制列表
6.2.2 列表类型的操作

• 列表有特有的函数或方法用于完成列表元素的增删改查,其中 ls 、
lst 分别为两个列表, x 是列表中的元素, i 和 j 是列表的索引。

操作符 操作符
ls[i]=x ls.append(x)
ls[i:j]=lst ls.clear()
ls[i:j:k]=lst ls.copy()
del ls[i:j] ls.insert(i,x)
del ls[i:j:k] ls.pop(i)
ls+=lst(ls.extend(lst)) ls.remove(x)
ls*=n ls.reverse(x)
ls.sort()
列表的应用案例 1

 输入一个长度任意的字符串反转输出。
要求:请使用 list 函数, join 函数和 reverse 函数。
算法思路:
 join 函数的用法
字符串
list 函数 s1=insert_string.join(list1)
列表 (reverse() ) 例如: s1 = "$$$".join( ['H', 'u', 's', 't'] )
执行完之后, s1 为 H$$$u$$$s$$$t
join 函数
思考: ls1="".join(['H','u','s','t'])
字符串 结果怎样?
列表的使用

 字符串的 join 函数配合使用列表的 list 函数,对原始字符串进行转


变,构建新的字符串:
 list 类型转换函数 list1=list(s)
作用:将序列 s( 可为字符串、元组 ) 转换成列表 list1
例如:
s="Hust"
s_list=list(s) # s_list 为 ['H', 'u', 's', 't']
print(s_list)
s1="**".join(s_list) # 执行后 s1 的值为 : H**e**l**l**o
列表的应用案例 2

• 统计字符串中的单词个数。(单词之间用, . ; ? 或空格隔开)
如: str=“I am a girl! I love my country. My name is zhuli.”
算法思路:
1 )将字符串规整化,单词之间都用空格隔开。
str.replace(ch,“ ")
2 )利用空格将字符串转换成列表。
str.split(sep=“ ")
3 )统计列表的元素个数。
len(ls )
6.3 基本统计值的计算

• 输入:从用户、文件、网络等途径获取一组数据
从键盘输入若干需统计的数据,如:
【 1,2,3,4,5,6,7,8,9,10 】

• 处理:适当的数据结构和算法
数据结构:输入时【字符串】——》处理时【列表】
算法:循环遍历列表的每个数据项,分别计算平均值,标准差和中位数

• 输出:平均值、标准差和中位数。
6.3 基本统计值的计算

使用函数方式编写程序,定义如下函数:
• getNum ()从用户输入获得数据
• mean ()计算平均值
• dev() 计算标准差
• median() 计算中位数
6.4 字典类型和操作

• - 字典类型定义
• - 字典处理函数及方法
• - 字典类型应用场景
字典类型是“映射”的体现
• - 键值对:键是数据索引的扩展
• - 字典是键值对的集合,键值对之间无序
• - 采用大括号 { } 和 dict() 创建,键值对用冒号 : 表示
{< 键 1>:< 值 1>, < 键 2>:< 值 2>, … , < 键 n>:< 值 n>}
字典的定义和使用

>>>d = {" 中国 ":" 北京 "," 美国 ":" 华盛顿 "," 法国 ":" 巴黎 "}


>>>d
{' 中国 ': ' 北京 ', ' 美国 ': ' 华盛顿 ', ' 法国 ': ' 巴黎 '}
>>>d[" 中国 "]
' 北京 '
>>> de = { }
>>> type(de)
<class 'dict'>
字典类型操作函数和方法

d 被修改
字典操作示例

>>>d = {" 中国 ":" 北京 "," 美国 ":" 华盛顿 "," 法国 ":" 巴黎 "}


>>>" 中国 "in d
True
>>>d.keys()
dict_keys([' 中国 ', ' 美国 ', ' 法国 '])
>>>d.values()
dict_values([' 北京 ', ' 华盛顿 ', ' 巴黎 '])
>>>d.get(" 中国 "," 伊斯兰堡 ")
' 北京 '
>>>d.get(" 巴基斯坦 "," 伊斯兰堡 ")
' 伊斯兰堡 '
>>>d.popitem()
(' 美国 ', ' 华盛顿 ')
字典的定义和使用

• 定义空字典 d >>>d={}

•  向 d 新增 2 个键值对元素 >>>d["a"]=1;d["b"]=2

•  修改第 2 个元素 >>>d["b"]=3

•  判断字符 "c" 是否是 d 的键 >>>"c” in d

•  计算 d 的长度 >>>len(d)

•  清空 d >>>d.clear()
字典类型应用场景

• 映射无处不在,键值对无处不在

- 例如:统计数据出现的次数,数据是键,次数是值

- 最主要作用:表达”键值对”数据,进而操作它们
• 作为遍历结构
for k in d:
< 语句块 >
6.5 jieba 库的使用

一段英文文本统计单词数: str.split() 方法。

一段中文如何统计词汇数量呢?

jieba 库 : 一个重要的第三方中文分词库。
#jieba 库的安装

• -jieba 库提供三种分词模式,最简单只需掌握一个函数 .
• 利用一个中文词库,确定中文字符之间的关联概率
• - 中文字符间概率大的组成词组,形成分词结果
• - 除了分词,用户还可以添加自定义的词组
jieba 库常用函数
6.6 文本词频统计
单词出现次数:
• 问题描述

- 需求:一篇文章,出现了哪些词?哪些词出现得最多?

- 该怎么做呢?

• 英文文本 VS 中文文本

- 英文文本: Hamet 分析词频


https://python123.io/resources/pye/hamlet.txt
- 中文文本:《三国演义》分析人物
https://python123.io/resources/pye/threekingdoms.txt

- 使用字典表达词频
英文词频统计

hamletTxt= getText()
words = hamletTxt.split()
If word in counts:
counts = {}
counts[word]=counts[word]+1
for word in words: ese:
counts[word] = counts.get(word,0) + 1 counts[word]=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))
中文词频统计
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1: continue ## 排除单个字的分词
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambdax:x[1], reverse=True)
for i in range(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
小结

• 序列操作的运算符和函数。
• 根据不同组合数据类型特点,介绍了循环遍历、增删改查、排序等内容。
• 列表是一种常见的数据结构,是一种 序列结构。
• 元组是无法修改的,其重点在于增删查操作。(扩展)
• 字典是 Python 中内置的映射类型,由 key-value 的键值对组成,通过
key 可以找到其映射的值 value 。(扩展)
• 字典的增删改查、遍历。(扩展)
作业

( 1 )用字典描述学生信息,包括 no( 学号 ) , name( 姓名 ),score( 成


绩 ) 等。使用列表存储学生信息的,并根据给定学生姓名,查找学生的
信息。
( 2 )使用 input 函数,输入若干单词,按字典顺序输出单词 ( 如果某
个单词出现多次,只输出一次 ) 。
( 3 )利用元组创建一个存储 Python 关键字的对象,并检测给定的单
词是否是 Python 关键字。
Thanks

You might also like