列表和元祖都属于序列类型,该序列内可以包含任意数据类型,且数据存储是有序的,索引从0到1
一:列表概述
1.1 如何定义一个列表
中括号,已逗号为分割符,可以放任意的数据类型,甚至是对象。
li = ['wangys','lala',123,[1,2,3],{'name':'wangys'}]
# 列表也可以嵌套
l2 = [['a','b'],[1,2],[]]
1.1.2 取单个元素,取出的是原数据类型
li = ['wangys','lala',123,[1,2,3],{'name':'wangys'}]
l1=li[0]
print(l1,type(l1))
l2=li[2]
print(l2,type(l2))
l3=li[3]
print(l3,type(l3))
1.1.2 取多个元素,取出的是列表类型
li = ['wangys','lala',123,[1,2,3],{'name':'wangys'}]
l4=li[0:2]
print(l4,type(l4))
二、 列表操作之-查
2.1 根据索引查找元素
索引是指元素在列表的位置顺序,从0开始,最有一个元素为长度-1
l = ['wangys',18,'male','IT']
print(l[0]) # 查看列表第一个元素即索引为0的元素
print(l[-1]) # 查看列表最后一个元素即索引为-1的元素
print(l[-2]) # 查看列表倒数第二个元素,即索引为-2的元素
结果如下:
wangys
IT
male
如果索引过界,则会报错,并且后面的代码不会执行
l = ['wangys',18,'male','IT'] print(l[4] # 查看列表第5个元素,即索引为4的元素,索引过界,导致错误 结果如下:
IndexError: list index out of range
2.2 列表分片查找元素
- 列表分片其实得到了一个子列表
- 顾首不顾尾
l = ['wangys',18,'male','IT'] print(l[1:3]) # 取列表第二个(索引为1)到第三个元素(索引为2),但顾首不顾尾,所以取最后索引+1 # [18, 'male']
# 如果结束索引要早于开始索引,会产生一个空列表
l = ['wangys',18,'male','IT'] print(l[3:1]) print(l[-2:1]) [] []
# 省略开始索引,从第一个元素开始取值
l = ['wangys',18,'male','IT'] print(l[:2]) # ['wangys', 18]
# 省略结束索引,取到最后一个元素
l = ['wangys',18,'male','IT'] print(l[1:]) [18, 'male', 'IT']
# 开始索引和结束索引都省略,则复制整个列表
l = ['wangys',18,'male','IT'] print(l[:])
# 设置步长
默认步长为1,开始索引,结束索引,步长使用冒号分隔
l = [1,2,3,4,5,6,7,8,9,10] print(l[1:9:2]) # [2, 4, 6, 8]
# 步长不能为0.如果为0,则报错
l = [1,2,3,4,5,6,7,8,9,10] print(l[1:9:0]) # ValueError: slice step cannot be zero
# 如果步长为负数,那么开始索引要比结束索引要大
l = [1,2,3,4,5,6,7,8,9,10] print(l[6:9:-2]) # 开始索引>结束索引,返回一个空列表 print(l[9:6:-2]) # 开始索引要大于结束索引 [] [10, 8]
2.3 检查某个元素是否是列表元素
使用in关键字,如果在列表种返回True,不在返回False
info = ['wangys',18,'male'] print('wangys' in info) print('female' in info) True False
account = [ ['wangys','123456'], ['wc','123456'], ['xc','hello'] ] username = input('请输入用户名:') password = input('请输入密码:') if [username,password] in account: print('登录成功') else: print('登录失败') 请输入用户名:wangys 请输入密码:123456 登录成功
2.4 查看列表中某个元素出现的个数
num = [1,2,3,1,2,4] CountOf1=num.count(1) print(CountOf1)
2.5 查看元素索引
- 如果元素不存在报错
wangys_info = ["wangys",23,'male']
print(wangys_info.index('male'))
# 2
print(wangys_info.index('malea'))
# ValueError: 'malea' is not in list
三、列表操作之-增
3.1 append
- 在末尾相加
- 一次只增加一个元素,无论要append的是单个元素还是一个列表
li = ['wangys','gongzhu'] li.append('caomei') li.append('1') print(li)
# 需求: 员工列表,往员工列表里添加员工,可以持续添加,当输入q时退出
people = ['wangys','huisz']
flag = True
while flag:
add_people = input("请输入员工姓名:").strip()
if add_people.upper() == 'Q':
flag = False
else:
people.append(add_people)
print(people)
# append的列表,会将该列表作为一个元素append
num = [1,2,3,4,5] num.append([6,7]) print(num) # [1, 2, 3, 4, 5, [6, 7]]
# 可以使用extend方法
num = [1,2,3,4,5]
num.extend([6,7])
print(num)
# [1, 2, 3, 4, 5, 6, 7]
3.2 insert 按照索引进行插入
name = ['wangys','chaoyf'] name.insert(1,'huisz') print(name)
# ['wangys', 'huisz', 'chaoyf']
3. 3 extend
- 和相加类似,但相加产生了一个新的列表,二extend是修改原列表
- extend 将可迭代对象插入到列表的末尾,插入的是可迭代对象的每个元素
整型是不可迭代对象
name = ['wangys','chaoyf'] name.extend('lala') print(name)
# ['wangys', 'chaoyf', 'l', 'a', 'l', 'a']
name.extend([1,2,3]) print(name)
# ['wangys', 'chaoyf', 'l', 'a', 'l', 'a', 1, 2, 3]
四、列表操作之-删
4.1 pop
- pop 有返回值,该返回值是被删除的数据
- 按索引删除
- 不指定索引,把最后一个元素删除
- 如果指定的索引不存在则报错
name = ['wangys','lala'] delete_name = name.pop() print(delete_name,name) # lala ['wangys']
name = ["wangys","haha"] name.pop(0) print(name)
# ['haha']
name = ["wangys","hehe"] print(name.pop())
# hehe
# 索引不存在,报错 num1 = [1,2,3,4] num1.pop(6) print(num1) # IndexError: pop index out of range
4.2 按照元素去删除
- 默认删除匹配到的第一个元素
- 如果元素不存在,则报错
name = ['wangys','dede'] name.remove('dede') print(name)
# ['wangys']
nums = [1,2,3,4,5,6,3] nums.remove(3) 删除列表中第一次匹配到的3元素 print(nums) # [1, 2, 4, 5, 6, 3] # 可以看到确实是删除了,但后面的3没有删除
# 如果元素不存在,则报错 num1 = [1,2,3,4] num1.remove('wangys') print(num1) # ValueError: list.remove(x): x not in list
4.3 清空列表
name = ["wangys","dsad"] name.clear() print(name)
# []
3.5.4 删除列表
name = ['wangys'] del name print(name)
3.5.5 切片删除
name = ['wangys',"lala",'haha'] del name[1:] print(name)
五、列表操作之-改
5.1 通过索引对列表进行修改
- 索引过界会报错
·
wangys_info = ["wangys",23,'male'] wangys_info[0] = 'wc' # 修改列表第一个元素 print(wangys_info) # ['wc', 23, 'male'] # 如果索引越界,则会报错 wangys_info = ["wangys",23,'male'] wangys_info[5] = 'wc' print(wangys_info) # IndexError: list assignment index out of range
5.2 分片字列表修改
- 新旧子列表元素个数可以不相等
# 新旧字列表元素个数不相等 wangys_info = ["wangys",23,'male'] wangys_info[:2] = ['wc','18','IT'] print(wangys_info) # ['wc', '18', 'IT', 'male'] # 新子列表是一个空列表 wangys_info = ["wangys",23,'male'] wangys_info[:2] = [] print(wangys_info) # ['male']
六、列表其他操作
6.1 列表相加
- 列表相加生成了一个新的列表,效率比较低,不建议使用
- 可以使用extend方法将两个列表合并。
将两个列表合并
l1 = [1,2,3] l2 = ['hello','world'] print(l1+l2) # [1, 2, 3, 'hello', 'world']
6.2 列表乘法
l = ['wangys'] print(l*3) ['wangys', 'wangys', 'wangys']
6.3 len,max,min 在列表中的用法
- len 返回列表的长度,元素个数
- max,返回列表内元素的最大值
- min,返回列表内元素的最小值
- 使用max,min函数时列表中的元素必须具有可比较性,如果没有(比如,不同数据类型)则会报错
nums = [1,2,3] print(max(nums)) print(min(nums)) 3 1 info = ['wangys',18,'male'] print(len(info)) print(max(info)) print(min(info)) 3 # TypeError: '>' not supported between instances of 'int' and 'str'
6.4 列表与其他数据类型的转换
6.4.1 str-list
使用list方法
name = 'wangys' l = list(name) print(l) # ['w', 'a', 'n', 'g', 'y', 's']
6.5 排序
- sort 会对原列表直接修改,如果是sorted函数会生成一个新的列表
- 对列表进行排序时,列表中的元素必须是可比较的,如果不可比较,则报错
正向排序
num = [3,6,2,5,4]
num.sort()
print(num)
# [2, 3, 4, 5, 6]
反向排序
num = [3,6,2,5,4]
num.sort(reverse=True)
print(num)
# [6, 5, 4, 3, 2]
# 数据类型不一致,导致排序报错
info = ['wangys',18,'male'] info.sort() print(info) # TypeError: '<' not supported between instances of 'int' and 'str'
# sort和sorted
nums = [1,2,3,4,5] nums.sort(reverse=True) print(nums) # [5, 4, 3, 2, 1] nums = [1,2,3,4,5] new_nums=sorted(nums,reverse=True) print(nums,new_nums) # [1, 2, 3, 4, 5] [5, 4, 3, 2, 1]
6.6 列表反转
num = [3,6,2,5,4]
num.reverse()
print(num)
# [4, 5, 2, 6, 3]
6.7 列表复制
- 生成了一个新的列表
num1 = [1,2,3,4] num2 = num1.copy() print(id(num1),id(num2)) # id不一样,说明不是同一个列表,做了复制 # 2185254579656 2185254596744
6.8 列表嵌套
wangys_info = ['wangys',23,'male',['sing','play',22],25]
取出wangys里的a
wangys_info = ['wangys',23,'male',['sing','play',22],25]
print(wangys_info[0][1])
将列表的第一个元素大写并替换之前的元素
wangys_info = ['wangys',23,'male',['sing','play',22],25]
wangys_info[0] = wangys_info[0].capitalize()
print(wangys_info)
将王诚替换为王永胜
wangys_info = ['wangys',23,'王诚',['sing','play',22],25]
wangys_info[2] = wangys_info[2].replace('诚','永胜')
print(wangys_info)
wangys_info = ['wangys',23,'王诚',['sing','play',22],25]
wangys_info[3][1] = wangys_info[3][1].upper()
print(wangys_info)
七、列表推导式
# 将name字符串的每个字符转换为ACII码 # 普通方法 name = 'wangys' l = [] for i in name: l.append(ord(i)) print(l) # 列表推导式方法 l =[ord(i) for i in name] print(l)
八: For循环
- 列表是可迭代对象,可以for循环去除列表的数据
- for循环列表的过程中,如果做删除操作,不安全
8.2 正确删除列表中元素的方式
直接删除会有问题
# 直接删除,会出问题
lst = ['张国荣','张三','张大千','李世民'] for el in lst: if el.startswith('张'): lst.remove(el) print(lst) # ['张三', '李世民']
正确做法,将要删除的元素刷选到新列表,循环新列表,删除旧列表
lst = ['张国荣','张三','张大千','李世民'] new_list = [] for el in lst: if el.startswith('张'): new_list.append(el) for el in new_list: lst.remove(el) print(lst)
其他方法
将列表二元组转换为字典
a = [('a','b')] b = [('c','d')] print(dict(a+b)) # {'a': 'b', 'c': 'd'}