Python中的列表和元组
列表(list)
一、列表的格式
[数据1,数据2,数据3,······]
列表可以一次性存储多个数据,而且这些数据可以是不同的数据类型。
但我们一般建议存储的数据为同一种数据类型。
二、列表的常用操作
1.查找
可以通过下标来找到列表中对应的数据。
另外,还有一些查找相关的函数:
- index():返回指定数据所在位置的下标。如果该数据不在列表里,则报错:
ValueError: 'TOMS' is not in list
name_list = ['TOM', 'Lily', 'ROSE']
print(name_list.index('Lily')) # 1
print(name_list.index('TOMS')) # ValueError: 'TOMS' is not in list
- count():统计指定数据在当前列表中出现的次数。
name_list = ['TOM', 'Lily', 'ROSE']
print(name_list.count('TOM')) # 1
print(name_list.count('TOMS')) # 0
- len():获取列表的长度,即列表中数据的个数。
name_list = ['TOM', 'Lily', 'ROSE']
print(len(name_list)) # 3
判断是否存在
- in:判断指定数据是否在某个列表序列,如果在,返回True,否则返回False
name_list = ['TOM', 'Lily', 'ROSE']
print('TOM' in name_list) #True
print('TOMS' in name_list) #False
- not in:判断指定数据是否在某个列表序列,如果不在,返回True,否则返回False
name_list = ['TOM', 'Lily', 'ROSE']
print('TOM' not in name_list) #False
print('TOMs' not in name_list) #True
in 和 not in 是一个公共操作,也就是说,in 和 not in 也同样适用于元组(tuple),序列(set)以及字典(dict)类型。
2.增加
- append():在列表结尾追加数据。
name_list = ['TOM', 'Lily', 'ROSE']
name_list.append('xiaoming')
print(name_list) #['TOM', 'Lily', 'ROSE', 'xiaoming']
name_list.append([11, 22])
print(name_list) #['TOM', 'Lily', 'ROSE', 'xiaoming', [11, 22]]
由此可见,列表数据可改的,所以列表属于可变数据类型。
append()函数追加数据的时候如果数据是一个序列,追加整个序列到列表的结尾。
- extend():在列表结尾追加数据,如果数据是一个序列,则将这个序列中的数据逐一添加到列表。
name_list = ['TOM', 'Lily', 'ROSE']
name_list.extend('boy')
print(name_list) #['TOM', 'Lily', 'ROSE', 'b', 'o', 'y']
name_list.extend(['boy', 'xiaohong'])
print(name_list) #['TOM', 'Lily', 'ROSE', 'b', 'o', 'y', 'boy', 'xiaohong']
extend()函数追加数据的时候如果数据是一个序列,把数据序列里面的数据拆开然后逐一追加到列表的结尾。
- insert():可以在指定位置新增数据。
name_list = ['TOM', 'Lily', 'ROSE']
# name_list.insert(下标, 数据)
name_list.insert(1, 'aaa')
print(name_list)
3.删除
- del:可以删除整个列表,也可以删除列表里指定数据。
删除整个列表:
name_list = ['TOM', 'Lily', 'ROSE']
del name_list
del(name_list)
删除指定数据:
del name_list[0]
print(name_list) #['Lily', 'ROSE']
- pop():删除指定下标的数据,如果不指定下标,默认删除最后一个数据,并将删除的数据返回。
name_list = ['TOM', 'Lily', 'ROSE']
del_name = name_list.pop()
print(del_name) #ROSE
print(name_list) #['TOM', 'Lily']
del_name = name_list.pop(1)
print(del_name) #Lily
print(name_list) #['TOM']
- remove():移除列表中某个数据的第一个匹配项。如果找不到匹配项,则报错:
ValueError: list.remove(x): x not in list
name_list = ['TOM', 'Lily', 'ROSE']
name_list.remove('ROSE')
print(name_list) #['TOM', 'Lily']
name_list.remove("aa")
print(name_list) #ValueError: list.remove(x): x not in list
- clear():清空整个列表。
name_list = ['TOM', 'Lily', 'ROSE']
name_list.clear()
print(name_list) #[]
4.修改
- 修改指定下标数据
name_list = ['TOM', 'Lily', 'ROSE']
name_list[0] = 'aaa'
print(name_list) #['aaa', 'Lily', 'ROSE']
- 逆置:reverse()
list1 = [1, 3, 2, 5, 4, 6]
list1.reverse()
print(list1) #[6, 4, 5, 2, 3, 1]
- 排序:sort()
list1 = [1, 3, 2, 5, 4, 6]
list1.sort()
print(list1) #[1, 2, 3, 4, 5, 6]
list1.sort(reverse=False)
print(list1) #[1, 2, 3, 4, 5, 6]
list1.sort(reverse=True)
print(list1) #[6, 5, 4, 3, 2, 1]
5.复制
数据的来源不易:人工手动输入数据,爬虫爬取到的数据,通过统计得到的数据,通过用户注册或其他行为得来的数据,这些数据可能都是非常重要的。所以我们在修改或删除数据之前,都要事先将原始数据复制出来几份作为备份。
函数:
- copy()
name_list = ['TOM', 'Lily', 'ROSE']
list1 = name_list.copy()
print(list1) #['TOM', 'Lily', 'ROSE']
print(name_list) #['TOM', 'Lily', 'ROSE']
三、列表的循环遍历
1.利用while遍历
name_list = ['TOM', 'Lily', 'ROSE']
i = 0
while i < len(name_list):
print(name_list[i])
i += 1
2.利用for遍历
name_list = ['TOM', 'Lily', 'ROSE']
for i in name_list:
# 遍历序列中的数据
print(i)
由此可见,遍历列表中的元素时使用for循环更加简洁方便。
四、列表的嵌套
所谓列表嵌套指的就是一个列表里面包含了其它的子列表。它很像Java中的多维数组。
例如:
name_list = [['TOM', 'Lily', 'Rose'], ['张三', '李四', '王五'], ['xiaohong', 'xiaoming', 'xiaolv']]
如果要查找李四:
print(name_list[1][1]) #李四
五、列表之综合应用—随机分配办公室
# 需求:8位老师,3个办公室, 将8位老师随机分配到3个办公室
"""
步骤:
1. 准备数据
1.1 8位老师 -- 列表
1.2 3个办公室 - 列表嵌套
2. 分配老师到办公室
*** 随机分配
就是把老师的名字写入到办公室列表 -- 办公室列表追加老师名字数据
3. 验证是否分配成功
打印办公室详细信息:每个办公室的人数和对应的老师名字
"""
import random
# 1. 准备数据
teachers = ["李华","TOM","Ben","Rose","小明","小红","华华","艾斯","秃头"]
offices = [[], [], []]
# 2. 分配老师到办公室 -- 取到每个老师放到办公室列表 -- 遍历老师列表数据
for name in teachers:
# 列表追加数据 -- append(选中) extend insert
# xx[0] -- 不能指定是具体某个下标 -- 随机
num = random.randint(0, 2)
offices[num].append(name)
# print(num)
# print(offices)
# 为了更贴合生活,把各个办公室子列表加一个办公室编号 1, 2, 3
i = 1
# 3. 验证是否分配成功
for office in offices:
# 打印办公室人数 -- 子列表数据的个数 len()
print(f"{i}号办公室分配到{len(office)}位老师,他们是:")
# 打印老师的名字
# print() -- 每个子列表里面的名字个数不一定 -- 遍历 -- 子列表
for name in office:
print(name)
i += 1
元组(tuple)
一、元组的应用场景
如果想要存储多个数据,而且这些数据必须不能够被修改。那么元组将是一个合适的选择。
元组中存放的数据,以及元组本身都是不可改变的,属于不可变类型。
但是列表是可变类型。
二、定义元组
# 1. 多个数据元组
t1 = (10, 20, 30)
print(type(t1)) #<class 'tuple'>
# 2. 单个数据的元组
t2 = (10,)
print(type(t2)) #<class 'tuple'>
【注意】:如果定义的元组里只存放了一个数据,那么这个数据后面也应该添加逗号,否则,它的数据类型就不是元组而是该数据的数据类型。
# 3. 如果单个数据的元组不加逗号
t3 = (10)
print(type(t3)) # <class 'int'>
t4 = ('aaa')
print(type(t4)) # <class 'str'>
三、元组的常用操作
元组不支持修改,只支持查找。
以下我们使用这个元组来操作:
t1 = ('aa', 'bb', 'cc', 'bb')
- 按下标查找数据
print(t1[0]) #aa
- index()
print(t1.index('bb')) #1
print(t1.index('bbb')) #ValueError: tuple.index(x): x not in tuple
- count()
print(t1.count('aa')) #1
print(t1.count('aaa')) #0
- len()
print(len(t1)) #4
如果元组里面有列表,可以修改列表里的数据(这不常用,谨慎使用)
如果直接使用下标修改元组里的数据,会直接报错:TypeError: 'tuple' object does not support item assignment
但是,如果元组里面有列表,修改列表里的数据是支持的。
t2 = ('aa', 'bb', ['cc', 'dd'])
t2[2][0] = 'TOM'
print(t2) #('aa', 'bb', ['TOM', 'dd'])