文章目录
CH5. 组合数据类型
序列和索引
-
序列是一个用于存储多个值的连续空间,每个值都对应一个整数的编号,称为索引
-
索引分为**
正向递增索引
和反向递减索引
**,正向递增从0开始,反向递减从-1开始
切片
- 序列
[start: end: step]
s='HelloWorld'
# 切片操作
s1 = s[0:5:2] # 索引从0开始,到5结束(不包含5),步长为2
print(s1) # 输出:Hlo
print(::-1) # 字符串逆序输出
序列的操作
序列相加和相乘
- 如字符串相加和相乘
s1 = 'hello'
s2 = 'world'
print(s1 + s2)
print('-'*40)
序列的常用操作符/函数
操作符/函数 | 描述说明 |
---|---|
x in s | 如果x是s的元素,结果为True,否则结果为False |
x not in s | 如果x不是s的元素,结果为True,否则结果为False |
len(s) | 序列s中元素的个数(即序列的长度) |
max(s) | 序列s中元素的最大值 |
min(s) | 序列s中元素的最小值 |
s.index(x) | 序列s中第一次出现元素x的位置 |
s.count(x) | 序列s中出现x的总次数 |
列表
列表的定义
- 列表是指一系列的按照特定顺序排列的元素组成
- 是Python中内置的可变序列
- 在Python中使用
[]
定义列表,元素与元素之间使用英文的逗号,
分隔 - 列表中的元素可以是任意的数据类型
列表的创建
- 可以使用
[]
直接创建列表- 语法结构如下:
列表名 = [element1,element2,...,elementN]
- 语法结构如下:
- 使用内置函数
list()
创建列表- 语法结构如下:
列表名 = list(序列)
- 语法结构如下:
- 列表的删除
- 语法结构如下:
del 列表名
- 语法结构如下:
lst = ['hello', 'world', 98, 100, 0]
print(lst)
lst2 = list('helloworld')
lst3 = list(range(1,10,2))# 从1到10,步长为2,不包含10
列表的遍历操作
- 使用for循环
lst = ['hello', 'world', 'python', 'go']
for item in lst:
print(item)
for i in range(0, len(lst)):
print(lst[i])
for index,item in enumerate(lst):
print(index, item) # index是序号,不是索引,默认从0开始
# 可以手动设置序号
for index,item in enumerate(lst, start=1):
print(index, item) # index从1开始
列表的相关操作
列表的方法 | 描述说明 |
---|---|
lst.append(x) | 在列表lst最后增加一个元素 |
lst.insert(index, x) | 在列表中第index位置增加一个元素 |
lst.clear() | 清除列表lst中所有元素 |
lst.pop(index) | 将列表lst中第index位置的元素取出,并从列表中将其删除 |
lst.remove(x) | 将列表lst中出现的第一个元素x删除 |
lst.reverse() | 将列表lst中的元素反转 |
lst.copy() | 拷贝列表lst中的所有元素,生成一个新的列表 |
lst.sort() | 列表的排序,默认升序(降序:st.sort(reverse=True) ) |
sorted(lst) | 产生一个新的列表,默认升序 |
列表生成式
-
语法结构:
lst = [expression for item in range]
lst = [expression for item in range if condition]
import random
lst = [item for item in range(1, 11)]
print(lst)
lst = [item*item for item in range(1, 11)]
print(lst)
lst = [random.randint(1, 100) for _ in range(10)]
print(lst)
lst = [i for i in range(10) if i%2 == 0]
print(lst)
'''
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[53, 9, 32, 69, 18, 17, 93, 97, 86, 14]
[0, 2, 4, 6, 8]
'''
二维列表
- 二维列表:表格数据
- 二维列表创建
# 二维列表的创建
lst = [
['城市', '环比', '同比'],
['北京', 102, 103],
['上海', 104, 504],
['深证', 100, 39]
]
# 二维列表的遍历
for row in lst: # 行
for item in row: # 列
print(item, end='\t')
print()
# 列表生成式
lst2 = [ [j for j in range(5)] for i in range(4)]
print(lst2)
'''
城市 环比 同比
北京 102 103
上海 104 504
深证 100 39
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
'''
元组
元组的定义
-
基本定义
- 元组是Python中内置的不可变序列
- 在Python使用
()
定义元组,元素与元素之间使用英文的逗号,
分隔 - 元素中只有一个元素的时候,逗号也不能省略
-
元组的创建方式
-
使用
()
直接创建元组- 语法结构如下:
元组名 = (element1, element2, ..., elementN)
- 语法结构如下:
-
使用内置函数
tuple()
创建元组- 语法结构如下:
元组名 = tuple(序列)
- 语法结构如下:
-
-
删除元组:
del 元组名
# 使用()创建元组
t = ('hello', [10,20,30], 'python', 'world')
print(t)
# 使用内置函数tuple()
t1 = tuple('helloworld')
print(t1)
t2 = tuple([10, 20, 30, 40])
print(t2)
t3 = (10)
print(t3, type(t3)) # int
t3 = (10,)
print(t3, type(t3)) # 元组中只有一个元素,逗号不能省略
'''
('hello', [10, 20, 30], 'python', 'world')
('h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd')
(10, 20, 30, 40)
10 <class 'int'>
(10,) <class 'tuple'>
'''
元组的遍历
- 与列表的遍历和访问相同
元组生成式
- 元组生成式创建元组,创建的是一个生成器对象,需要通过内置函数进行转换
t = (i for i in range(1,4))
print(t) # 生成器对象
# 元组生成式需要使用内置函数进行转换
t = tuple(t)
print(t)
'''
<generator object <genexpr> at 0x000001753D2B7A00>
(1, 2, 3)
'''
t.__next__()
可以取出生成器对象中的元素
t = (i for i in range(1,4))
print(t) # 生成器对象
print(t.__next__())
print(t.__next__())
print(t.__next__())
print(t) # 生成器对象中的元素已取出,此时t为空
'''
<generator object <genexpr> at 0x0000020860797A00>
1
2
3
()
'''
元组和列表的区别
元组 | 列表 |
---|---|
不可变序列 | 可变序列 |
无法实现添加、删除和修改元素等操作 | append()、insert()、remove()、pop()等方法实现添加和删除列表元素 |
支持切片访问元素,不支持修改操作 | 支持切片访问和修改列表中的元素 |
访问和处理速度快 | 访问和处理速度慢 |
可以作为字典的键 | 不能作为字典的键 |
字典
字典的定义
-
字典类型是根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成的成对关系
-
可变的数据类型
-
key
不可重复 -
可变序列不能作为
key
-
注意:字典中的
key
是无序的,Python3.5及其之前的版本字典的key是在输出时无序,但是从Python3.6版本之后Python解释器进行了处理,所以才会看到输出的顺序与添加的顺序”一致’
字典的创建方式
-
使用
{}
直接创建字典d={key1:value, key2:value2, ...}
-
使用内置函数
dict()
创建字典dict(key1=value1, key2=value2, ...)
-
通过映射函数
zip()
创建字典zip(lst1, lst2)
,key:value自动映射,lst1和lst2中的值一一对应
-
删除字典:
del 字典名
# 创建字典
d = {10:'cat', 20:'dog', 30:'pet', 20:'zoo'}
print(d) # key相同时,value进行了覆盖
# 映射函数
lst1 = [10,20,30,40]
lst2 = ['cat', 'dog', 'pet', 'zoo', 'car']
zipobj = zip(lst1, lst2)
print(zipobj) # 打印出来是一个zip obj对象
# print(list(zipobj)) # 可以将zip object转换为一个列表
d = dict(zipobj)
print(d)
# 内置函数创建字典
d = dict(cat=10, dog=20)
print(d)
# 使用元组作为key
t = (10,20,30)
print({t:10})
# list不能作为key
# lst = [10,20,30]
# print({lst:10}) # TypeError: unhashable type: 'list'
'''
{10: 'cat', 20: 'zoo', 30: 'pet'}
<zip object at 0x000001ECD44E3200>
{10: 'cat', 20: 'dog', 30: 'pet', 40: 'zoo'}
{'cat': 10, 'dog': 20}
{(10, 20, 30): 10}
'''
字典遍历
-
字典元素的取值
d[key]
:当key不存在时,会报错d.get(key, default)
:default不指定时,key不存在会返回None;指定默认值,当key不存在时会返回默认值
-
遍历出key与value的元组
for element in d.items(): pass
-
分别遍历出key和value
for key,value in d.items(): pass
字典的相关操作方法
字典的方法 | 描述说明 |
---|---|
d[key]=value | 添加字典元素 |
d.keys() | 获取所有的key数据 |
d.values() | 获取所有的value数据 |
d.pop(key, default) | key存在时获取相应的value,同时删除key-value对,否则获取默认值 |
d.popitem() | 随机从字典中取出一个key-value对,结果为元组类型,同时将该key-value从字典中删除 |
d.clear() | 清空字典中所有key-value对 |
字典生成式
-
d = {key:value for item in range}
import random d = {item:random.randint(1,100) for item in range(4)} print(d) # {0: 67, 1: 55, 2: 43, 3: 74}
-
d = {key:value for key,value in zip(lst1, lst2)}
lst=[1001,1002,1003] lst2=['cat','dog','bee'] d = {key:value for key,value in zip(lst,lst2)} print(d) # {1001: 'cat', 1002: 'dog', 1003: 'bee'}
集合类型
集合的定义
- Python中集合与数学中集合的概念一致
- Python中的集合是一个无序的不重复元素序列
- 集合中只能存储不可变数据类型
- 在Python中集合使用
{}
定义 - 与列表、字典一样,都是Python中的可变数据类型
集合的创建方式
- 使用
{}
直接创建集合s = {element1, element2, element3, ...}
- 使用内置函数
set()
创建集合s = set(可迭代对象)
- 删除集合:
del 集合名
s = set() #创建一个空集合
print(s, type(s))
s = {} # 创建的是一个空字典
print(s, type(s))
s = set('helloworld')
print(s)
# {'w', 'e', 'o', 'l', 'r', 'd', 'h'}
# => 无序不可重复
集合类型的操作符
- 交集
A&B
- 并集
A|B
- 差集
A-B
- 补集
A^B
集合的相关操作方法
集合的方法 | 描述说明 |
---|---|
s.add(x) | 如果x不在集合s中,则将x添加到集合s |
s.remove(x) | 如果x在集合中,将其删除,如果不在集合中,程序报错 |
s.clear() | 清除集合中所有元素 |
集合的遍历
-
遍历元素
for item in s: print(item)
-
使用enumerate()函数
for index,item in enumerate(s): print(index, '-->', item) # 序号
集合生成式
s = {i for i in range(1,10)}
print(s)
# {1, 2, 3, 4, 5, 6, 7, 8, 9}
s = {i for i in range(10) if i%2==0}
print(s)
# {0, 2, 4, 6, 8}
列表、元组、字典、集合的区别
数据类型 | 序列类型 | 元素是否可重复 | 是否有序 | 定义符号 |
---|---|---|---|---|
列表list | 可变序列 | 可重复 | 有序 | [] |
元祖tuple | 不可变序列 | 可重复 | 有序 | () |
字典dict | 可变序列 | key不可重复,value可重复 | 无序 | {key:value} |
集合set | 可变序列 | 不可重复 | 无序 | {} |
Python3.11新特性
模式匹配
match-case
字典合并
d1|d2
同步迭代
'''
match data1,data2:
case data1,data2:
pass
'''
fruits = {'apple', 'orange', 'pear', 'grape'}
counts = [10,3,4,5]
for f,c in zip(fruits, counts):
match f,c:
case 'apple',10:
print("10个苹果")
case 'orange',3:
print("3个橘子")
case 'pear',4:
print("4个梨")
case 'grape',5:
print("5串葡萄")
# 4个梨
# fruits是集合,是无序的,输出结果是随机的
数据类型实战
实战1
-
“千年虫”是什么虫?
-
需求:已知一个列表中存储的是员工的出生年份[88,89,90,98,00,99],由于时间比较久,出生的年份均为2位整数,现需要2位年份前加19,如果年份是00,将需要加上200.
-
运行效果:
原列表:[88, 89, 90, 98, 0, 99]
[‘1988’, ‘1989’, ‘1990’, ‘1998’, ‘2000’, ‘1999’]
-
# python_exercise1.py
lst1 = [88, 89, 90, 98, 0, 99]
print('员工出生年份:', lst1)
lst2 = []
for item in lst1:
if item == 0:
lst2.append('200' + str(item))
else:
lst2.append('19' + str(item))
print('员工出生年份(新):', lst2)
实战2
- 模拟京东购物流程
- 需求:从键盘录入5个商品信息,添加到商品列表中,展示商品信息,提示用户选择商品,用户选中的商品添加到购物车中(购物车中的商品要逆序),用户选中的商品不存在需要有相应的提示,当用户输入“q“时循环结束,显示购物车中的商品
# python_exercise2.py
'''
1001手机
1002电脑
1003水杯
1004猫粮
1005猫砂
'''
# 5个商品入库
lstGoods = []
for i in range(5):
product = input('请输入商品的编号和商品的名称进行商品入库,每次只能输入一件商品:')
lstGoods.append(product)
# 输出所有商品信息
for item in lstGoods:
print(item)
# 购物车
cart = []
while True:
flag = False
num = input('请输入要购买的商品编号:')
# 遍历商品列表,查询以下要购买的商品是否存在
for item in lstGoods:
if num == item[0:4]: # 切片操作,匹配到商品编号则商品存在
flag = True
cart.append(item) # 将商品添加到购物车列表
print('商品已成功添加到购物车')
break
if not flag and num != 'q':
print('商品不存在')
if num == 'q':
break
print('-'*50)
print('您购物车里已选择的商品为:')
cart.reverse() # 最后添加的商品,显示在最前面,即倒序输出
for item in cart:
print(item)
实战3
- 模拟12306火车票订票流程
- 假设北京到天津有以下4个车次可供选择,用户选择所要购买的车次,进行购票进站
# python_exercise3.py
train = {
'G1569':['北京南-天津南', '18:06', '18:39', '00:33'],
'G1567':['北京南-天津南', '18:15', '18:49', '00:34'],
'G8917':['北京南-天津西', '18:10', '18:39', '00:59'],
'G203':['北京南-天津南', '18:35', '19:09', '00:34']
}
print('车次\t\t出发站-到达站\t\t出发时间\t到达时间\t历时时长')
for key,value in train.items():
print(key,end='\t\t')
for i in range(4):
if i < 3:
print(value[i], end='\t\t')
else:
print(value[i])
number = input('请输入要购买的车次:')
info = train.get(number)
if info:
passengers = input('请输入乘车人,如果是多位乘车人使用逗号分隔:')
# 打印乘车信息
print('您已购买了'+number, end=' ')
print(info[0]+' '+info[1]+'出发,', end='')
print('请'+passengers+'尽快换取纸质车票。【铁路客服】')
else:
print('您要购买的车次不存在!')
实战4
- 模拟手机通讯录
- 从键盘录入5位好友的姓名和电话,由于通讯录是无序的,所以使用集合来实现。
# python_exercise4.py
addr_book = set()
for i in range(1,6):
friend = input(f'请输入第{i}位好友的姓名和手机号:')
addr_book.add(friend)
# 遍历显示,无序的
for item in addr_book:
print(item)