第5章 容器类型的数据

105 阅读9分钟

第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,为负值则表示从右往左取)。

image.png

image.png

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个元素后跟上‘,’才能定义单元素的元组。

元组的操作

元组是“不能修改”的列表,因此列表中不涉及元素修改的操作都适⽤于元组

image.png

image.png

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 竖线 BA.union(B)
求交集A & BA.intersection(B)
求差集A - BA.difference(B)
求对称差集A ^ BA.symmetric_difference(B)