第5章 容器类型的数据
5.1 序列
序列(sequence)是一种可迭代的、元素有序的容器类型数据。(字符串、列表、元组、字节序列)
序列中的元素都是有序的,每一个元素都带有序号,这个序号叫作索引。索引有正值索引和负值索引之分。
1 序列的加和乘操作
加(+)运算符可以将两个序列连接起来,乘(*n)运算符可以将两个序列重复n次。
str = 'Hello'
print(str*2,end="; ")#HelloHello;
print(str+'World')# HelloWorld
2 切片的基本操作
切片运算符的语法形式为[start:end:step]
- 其中,start是开始索引,end是结束索引。(取值为左闭右开区间)。
- step是步长(切片时获取的元素的间隔,默认是1,为负值则表示从右往左取)。
5.2 列表与元组
1 列表与列表的操作
列表(list)⽤来有序存放⼀组相关数据,以便进⾏统⼀的处理。Python中,将⼀组数据放在⼀对⽅括号“[]”中即定义了⼀个列表。(可变序列类型)
增加列表元素(append,insert,extend,+)
name = []#建立一个空列表
name1 = ["李四","王五"]
name2 = ["李四2","王五2"]
name.append("张三")#尾部追加元素
name +=name1
name.extend(name2)#追加多个元素用+或者extend
name.insert(0,"第一")#指定位置插入元素
name.insert(-123,"我也是第一")
name.insert(123,"最后")# 当超过索引长度,则会放到最后
print(name)# ['第一', '张三', '李四', '王五', '李四2', '王五2']
删除列表元素(remove(x))
name = ["zs","ls","ww"]
print(name)
name.remove('zs')#找到匹配的元素x进行删除
print(name)
if 'ww' in name:#删除之前先判断这个元素是否在列表中,防止出现未找到值的异常
name.remove('ww')
print(name)
查询列表元素(index,len,in,not in,count)
name = ["ww","zs","ls","ww"]
print(len(name))#返回整个列表的长度
print(name.count('ww'))#统计目标值在列表中出现的次数
print("ww" in name)#目标值是否在列表中
print(name.index('zs'))#根据目标元素返回在列表中的索引下标,没有找到直接报错
遍历列表元素
name = ["ww","zs","ls","ww"]
for i in range(len(name)):#方式一:使用range函数遍历可以灵活访问部分元素
print(name[i])
for i in name:# 方式二:直接遍历元素,但是获取索引还需要调用方法
print('elem{} is {}'.format(name.index(i)+1,i))
for index,n in enumerate(name):# 方式三:第一个变量为索引,第二个变量为值
print(f'elem{index+1} is {n}')
列表元素排序
age = [1,7,32,4,234,13,34]
age.sort()#sort方法默认是对列表元素按升序排序,sort会改变原列表
print(age)
age.sort(reverse=True)#reverse参数为True时降序排列
print(age)
print(sorted(age))#sorted命令生成新的有序列表,不改变原列表
print(sorted(age,reverse=True))
功能差异:
- ① sort会改变原列表
- ② sorted函数会生成新列表
调用差异:
- ① sort是方法,需要ls.sort()调用
- ② sorted函数,可以直接使用sorted(ls)
列表的复制(赋值操作,copy())
age1 = [1,2,3,4,5]
age2 = age1#使用赋值操作,两列表空间共享
del age2[0]
print(age1)#[2, 3, 4, 5]
print(age2)#[2, 3, 4, 5]
age3 = [1,2,3,4,5]
age4 = age3.copy()#使用copy方法,两列表独立空间
del age4[0]
print(age3)#[1, 2, 3, 4, 5]
print(age4)#[2, 3, 4, 5]
列表的删除
age = [1,2,3,4,5]
del age[:]#经过删除“所有元素”的del操作后,列表中不包含任何元素,但是仍保留其列表的本质
print(type(age))
age2 = [1,2,3,4,5]
del age2#del 后面直接跟列表名,则彻底删除该列表对象
2 数值列表
数值列表的创建
list1 = input("请输入数值列表:\n")
print(type(list1))#<class 'str'>
#方式一:
list2 = eval(input("请输入数值列表:\n"))#如果输入时没有[]中括号则输入类型默认为元组
print(type(list2))#<class 'list'>
#方式二:list(range)
ss = list(range(1,6))
print(ss)
列表生成式
格式(参考资料):列表 = [循环变量相关表达式 for 循环变量 in range函数]
#创建一个由1~10这是个数的平方值组成的数值列表
list1 = []
for i in range(1,11):
list.append(i**2)
print(list)
list2 = [i**2 for i in range(1,11)]
print(list2)
3 元组与元组操作
元组是不可变序列,使用圆括号()
创建元组,并将多个数据放到元组中,这个过程被称为元组打包。
将元组中的元素取出,分别赋值给不同的变量。这个过程被称为元组拆包。
元组的创建方式
tuple1 =(1,2,3,4)#方式1,()可以省略
list = [1,2,3,4]
tuple2 = tuple(list)#方式2
print(type(tuple1))#<class 'tuple'>
print(type(tuple2))#<class 'tuple'>
tuple1 = (1)
print(type(tuple1))#<class 'int'>
tuple2 = (1,)
print(type(tuple2))#<class 'tuple'>
① 元组只有1个元素时,系统将其视作单个的字符串。
② 在1个元素后跟上‘,’才能定义单元素的元组。
元组的操作
元组是“不能修改”的列表,因此列表中不涉及元素修改的操作都适⽤于元组。
4 序列转换函数
元组与列表之间的转换
a = (1,2,3,4)
print(a)
b = list(a)
print(b)
c = [1,2,3,4]
print(c)
d = tuple(c)
print(d)
字符串转换成列表
name = "张三丰,郑太吉"
newName = list(name)#list函数转换后字符串中的单个字符依次成为列表元素
print(newName)
newName1 = name.split(",")
print(newName1)#方式2:分隔符却省。则按照空格进行拆分
5.3 集合与字典
1 字典与字典的操作
字典属于Python中一种基本的数据结构——映射。它通过键值对的方式存储了数据与数据之间的对应关系。
- 键: 不能重复且不能修改,只有不可变的数据可以充当键。
- 值: 可以重复且能被修改,任何类型的数据可以充当值
创建字典
#方式一:使用dict()函数
stu1 = dict({1:"zs",2:"ls"})
print(stu1)
#方式二:直接定义法
stu2 = {3:"wu",4:"ss"}
print(stu2)
#list是可变对象,不能被hash,报TypeError
stu33 = dict([1,2,3,4],['hello','world','first','two'])
print(stu33)
#zip()函数,将迭代对象打包成元组
stu3 = dict(zip([1,2,3,4],['hello','world','first','two']))
print(stu3)
修改字典
① 字典中的每一对“键值对” 被称为字典的条目。字典是无序的,不能通过序号、只能通过键访问条目的值。
② 字典只提供了“键”到“值”的单向访问,不能通过“值”直接反向访问“键” 。
③ 使用不存在的键访问字典条目也会引起系统报错;定义空字典即将一对空的大括号“{}”赋给字典对象。
赋值语句“字典名[键] = 值”是一个双重操作:
- ① 当其中的“键”在字典中不存在时,执行的是添加条目的操作;
- ② “键”在字典中存在时就执行修改条目的操作。
| 操作 | 指令 |
|---|---|
| 删除指定条目 | del 字典名 [键] |
| 清空字典条目 | 字典名.clear(),清空所有条目,使其成为空字典 |
| 直接删除整个字典 | del 字典名,直接从内存删除该字典对象,该对象不可再访问。 |
| 删除指定条目并返回值 | pop(key) |
| 随机删除一个字典条目 | popitem(),并且会返回被删除的完整条目。 |
ps:成员运算 in: 键 in 字典,使用del函数删除条目时,可以先用in运算进行确认,以免系统报错
访问字典
get方法获取条目的值: 字典名.get(键,默认值),键存在则返回值,不存在则返回默认值。
字典.items() : 提取字典所有条目,以双元素列表形式返回
字典.keys() : 提取字典所有键,以列表形式返回
字典.values() : 提取字典所有值,以列表形式返回
stu = {'zs':12,'ls':14,'ww':23,'mz':43}
print(stu.get('zs',0))
print(stu.get('zz',0))
print(stu.items())
print(stu.keys())
print(stu.values())
for item in stu.items():
print(item)
for k,v in stu.items():
print("{}同学,今年{}岁".format(k,v))
for key in stu.keys():
print(key,stu[key])
字典的合并
字典的合并即将两个字典合并成一个字典,可以理解为字典的扩充。
使用字典的update方法将参数字典条目合并进字典:字典名.update(参数字典名)
stu1 = {'zs':12,'ls':14,'ww':23,'mz':43}
stu2 = {'zs':12,'ds':32,'fd':54}
#将stu2的元素合并到stu1
stu1.update(stu2)
print(stu1)
① 相同“键”的条目,合并后只保留一个
② 参数字典扩充至主调字典中,参数字典本身不变
练习
统计字符串中字符出现次数
sentence="Life is short,we need Python."
sentence=sentence.lower() #将句中字符都统一成小写
counts={}
for c in sentence:
counts[c]=counts.get(c,0) + 1
print(counts)
将原来两个1对1的映射关系合并为一个1对2的映射关系。
dicAreas= {'俄罗斯': 1707.5, '加拿大': 997.1, '中国': 960.1, '美国': 936.4, '巴西': 854.7}
dicCapitals={'俄罗斯': '莫斯科', '加拿大': '渥太华', '中国': '北京', '美国': '华盛顿', '巴西': '巴西利亚'}
dicCountries={}
for key in dicAreas.keys():
dicCountries[key] =[ dicAreas[key] , dicCapitals[key] ]
for item in dicCountries.items():
print(item)
2 集合与集合的操作
集合是一种可迭代的、无序不重复的容器类型(序列中的元素是有序的)
组成集合的元素必须是不可变类型
集合除了支持数学中的集合运算外,主要用来进行关系测试和消除重复元素。
创建集合
① 直接创建集合,直接将元素(不可变)放在一对大括号“{}”中: {元素1, 元素2, ……}
② 使用set函数创建集合,可以将序列(字符串、元组、列表、字典)转换为集合。
通过set构造函数将字典转换为集合时,默认将字典的key作为元素构造集合
创建空集合:xxx = set();不能用一对空括号“{}”,而是要用不带参数的set函数。
修改集合
| 函数或方法 | 描述 |
|---|---|
| S.add(elem) | 添加元素,如果元素已经存在,则不能添加,不会抛出错误 |
| S.remove(elem) | 删除元素,如果元素不存在,则抛出错误。 |
| S.discard(elem) | 删除元素,如果元素不存在,不会报错。 |
| S.pop() | 从集合S中随机删除并返回一个元素。 |
| S.clear() | 清除集合。 |
集合的数学运算
| 功能 | 运算符 | 方法 |
|---|---|---|
| 求并集 | A 竖线 B | A.union(B) |
| 求交集 | A & B | A.intersection(B) |
| 求差集 | A - B | A.difference(B) |
| 求对称差集 | A ^ B | A.symmetric_difference(B) |