06 - 列表
一.列表的格式
-
空列表
listName = [] -
初始化列表
定义列的格式:
[元素1, 元素2, 元素3, ..., 元素n]tmp = ['xiaoWang',180, 65.0, [1,2], [True, 4]]
注意:列表也是数据的基本类型之一,所以列表中的元素可以是列表等基本数据类型
二.列表的相关操作
1.查
-
使用下标获取指定列表元素
- 也有两套索引机制--正向和反向
namesList = ['xiaoWang','xiaoZhang','xiaoHua'] print(namesList[0]) #xiaoWang print(nameList[-1]) #xiaoHua -
使用切片获取多个列表元素
list1 = [0,1,2,3,4] print(list1[:2]) #[0,1] print(list1[-2::-2]) #[3,1] -
关键字in 和 not in
- 元素 in 列表:表示元素是否在列表中,返回值为布尔型
- 删除之前可以先判断是否存在再删除(一般与if连用)
movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情'] if 'abc' in movieName: print('存在') else: print('不存在') -
index用来查找元素所在的位置,如果未找到则会报错
a = ['a', 'b', 'c', 'a', 'b'] a.index('a', 1, 4) #3 -
count用来计算某个元素出现的次数
a = ['a', 'b', 'c', 'a', 'b'] a.count('b') #2如果count返回值为0,表示此元素在列表中不存在
-
insert(index, object) :在指定位置index前插入元素object
strs = ['a','b','m','s'] strs.insert(3,'h') print(strs) # ['a', 'b', 'm', 'h', 's']
2.遍历列表
-
for xxx in xxx:
good = [1,2,3] for i in good: print(i,end=' ') container = [] while 2: name = input() age = input() good = [name,age] container.append(good) for goods in container: #将container列表中的值依次取出赋给goods列表(变量), print('{}\t{}'.format(goods[0],goods[1])) -
使用while
namesList = ['xiaoWang','xiaoZhang','xiaoHua'] length = len(namesList) # 获取列表长度 i = 0 while i<length: print(namesList[i]) i+=1
3.增
-
append 在末尾添加元素(原地操作)
list1 = ['A','B'] list1.append('C') #['A','B','C'] list2 = ['E','F','G'] list1.append(list2) #['A', 'B', 'C', ['E', 'F', 'G']]注:一次性加入,将元素做为一个整体添加到列表,作为一项
-
extend 合并两个列表
a = ['a','b','c'] b = ['d','e','f'] a.extend(b) print(a) # ['a', 'b', 'c', 'd', 'e', 'f'] 将 b 添加到 a 里 print(b) # ['d','e','f'] b的内容不变注:将列表的内容拆散了作为单个元素添加
-
insert 在指定位置插入元素
insert(index, object) 在指定位置index前插入元素object
strs = ['a','b','m','s'] strs.insert(3,'h') print(strs) # ['a', 'b', 'm', 'h', 's']
4.删
-
del:根据下标进行删除(有点特殊)
-
带有下标
a = [1,2,3,4] del a[1] print(a) -
如果是对列表名用del,表示删除列表名指向列表的指针,如果没有其他指针指向这个地址,空间就会被回收
a = [1,2,3,4] del a
-
-
pop:不带参数删除最后一个元素;带参数删除指定索引元素
movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情'] movieName.pop() #删除最后一个元素 movieName.pop(-2) #删除倒数第二个元素 -
clear:表示清空列表中的元素,但是空间和指针还在
a = [1,2,3,4] a.clear() -
remove:根据元素的值或元素的名进行删除
movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情'] movieName.remove('指环王') role = [['a',1],['b',2],['c',3]] aName = role[0] role.remove(aName) #这里可以写元素名字 print(role)注意:有同名元素,只删除从左到右第一个指定元素
4-1.如果列表中有同名元素,如何删除同名元素
易错:为什么不能直接用for循环按照元素名字删除?
因为如果列表中同名的元素相邻,当food下标取到1时,将元素值赋给i,判断i='烧烤',于是将此元素删除。删除此元素后,列表的下标会发生变化,将元素全部往前移动,不能留空位,于是同名的烧烤下标从2变成了1,后面的元素下标依次-1,但是for循环的下标进入下一次循环会从2开始,所以就漏了目前下标变为2的元素。
#错误的写法!!!!!
food = ['米饭','烧烤','烧烤','薯条','酸奶','可乐','烧烤']
for i in food:
if i == '烧烤'
food.remove('烧烤') #因为remove只删除列表中第一个出现指定名称的元素
-
有同名的元素可以借助remove加while循环来删除
food = ['米饭','烧烤','烧烤','薯条','酸奶','可乐','烧烤'] n = 0 while n < len(food): if food[0] == '烧烤': food.remove('烧烤') #如果删除此元素,n的值不变,下一次循环还是从当前下标开始取值 else: n += 1 print(food) -
借助for和切片反向查找通过下标删除
food = ['米饭','烧烤','烧烤','薯条','酸奶','可乐','烧烤'] for i in food[::-1]: if i == '烧烤': food.remove(i) print(food) -
还有很多方法,都可以成立
5.改--修改列表元素
- 我们是通过指定下标来访问列表元素,因此修改元素的时候,为指定的列表下标赋值即可。
6.列表转化为字符串
-
join:将列表中的元素以某符号为间隔拼接起来,返回字符串
result = '#'.join(['1','2','a']) print(result) #结果: 1#2#a但是注意:列表中的元素必须全是字符串类型的才可以拼接
三.列表的地址问题
- 当一个列表名 = 另一个列表名时,是将地址赋给了前面,那么两者中任何一个列表做修改,内容会同时发生变化,因为两个列表名指向的是同一个空间
a = [1,2,3]
b = a
b.append(4)
print(a)
- 当使用del删除列表时,因为a和b指针指向同一个地址空间,del a 只是删除了a的指针,但是列表空间还有b指针指,所以不会被回收
a = [1,2,3]
b = a
del a
print(b) #b依旧在
四.列表的复制
-
=号赋值,是将地址赋给了前面,那么两者中任何一个列表做修改,内容会同时发生变化,因为两个列表名指向的是同一个空间
a = [1,2,3] b = a b.append(4) print(a) -
copy方法
使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制。
nums1 = [1, 5, 8, 9, 10, 12] nums2 = nums1.copy() # 调用列表的copy方法,可以复制出一个新的列表 nums2[0] = 100 # 修改新列表里的数据,不会影响到原有列表里的数据 print(nums2) print(nums1) -
切片
列表和字符串一样,也支持切片,切片其实就是一种浅拷贝。
words1 = ['hello', 'good', ['yes', 'ok'], 'bad'] words2 = words1[:] words2[0] = '你好' words2[2][0] = 'no' print(words1) # ['hello', 'good', ['no', 'ok'], 'bad'] print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']
五.列表的排序和逆序
都属于原地操作
-
sort:将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小
-
reverse:将list逆置。
a = [1, 4, 2, 3] a.reverse() #逆序 a.sort() #默认从小到大排序 a.sort(reverse=True) #从大到小排序 -
例题:
''' 生成8个1-100之间的随机整数,保存到列表中 键盘输入一个1-100之间的整数,将整数插入到排序后的列表中(降序) ''' import random list1 = [] for i in range(8): number = random.randint(1,100) list1.append(number) innum = int(input('input a integer between 1 to 100:')) list1.append(innum) list1.sort() list1.reverse() print(list1) -
冒泡排序:
import random list1 = [] n = random.randint(1,15) for i in range(n): number = random.randint(1,100) list1.append(number) print('原先的:',end='') print(list1) for i in range(len(list1) - 1): for j in range(len(list1) - 1 - i): if list1[j] > list1[j + 1]: list1[j], list1[j + 1] = list1[j + 1], list1[j] print('排序后的:',end='') print(list1)
六.列表推导式
-
列表推导式:通过列表推导式:旧的列表 ----> 新的列表,即最终得到的是一个列表
-
列表推导式的格式
[表达式或元素 for 变量 in 可迭代的]或者[表达式或元素 for 变量 in 可迭代的 if 条件]或者[结果1 if 条件 else 结果2 for 变量 in 可迭代的]或者[结果 for i in 可迭代的 if 条件 for j in 可迭代的 if 条件]说明:表达式为对旧列表中满足条件的元素做相关操作(也可以直接取满足条件的元素不做操作),即可理解为对新列表中的元素做操作
for 变量 in 旧列表:将旧列表中的元素依次取出来赋给变量
if 条件:旧列表取出来的元素即变量,需要满足的条件
-
格式1:
[i for i in 可迭代的]- 第一个i:就是最终列表中存放的元素,可以做相关操作:比如 i+2
- 可迭代的:可以是列表、元组、字典、字符串、range()
''' 将0-100所有偶数存放到列表中 ''' list1 = [i for i in range(0,101,2)] #每循环一次就将第一个i(值等于for中的i)添加到新列表中 print(list1) list2 = ['a' for i in range(5)] #每循环一次,就将'a'元素添加到新的列表中 print(list2) #['a', 'a', 'a', 'a', 'a'] -
格式2:
[i for i in 可迭代的 if 条件]- 执行顺序:先执行
for i in 可迭代的;再执行if 条件;再将满足条件的第二个i赋给到第一个i中存放到列表中
#将全是字母的元素存放到新的列表中 list1 = ['hello','23','world','high','34'] list2 = [alp for alp in list1 if alp.isalpha()] #先做for将迭代的结果赋给第二个alp,然后对alp做 判断,满足if语句的alp赋给第一个alp print(list2)#将长度小于4的人名首字母大写 -- 这里没有使用filter高阶函数中的lambda函数 names = ['tom','lily','jack','bob','steven'] result = [name.capitalize() for name in names if len(name) > 3] print(result) #不用列表推导式 def func(names): newlist = [] for name in names: if len(name) > 3: newlist.append(name) #列表推导式中的表达式中的元素就是这里的name return newlist print(func(names)) - 执行顺序:先执行
-
格式3:
[结果1 if 条件 else 结果2 for 变量 in 可迭代的]执行顺序:先执行
for 变量 in 可迭代的,然后将变量送到if 条件,如果成立赋给结果1,如果不成立给结果2#如果是h开头的则将首字母大写,不是h开头的全部转为大写 list1 = ['hello','23','world','high','34'] list2 = [word.title() if word.startswith('h') else word.upper() for word in list1] print(list2) -
格式4:
[结果 for i in 可迭代的 if 条件 for j in 可迭代的 if 条件]- 可嵌套多层for循环,左边是外层,右边是内层,... 依次推到下去
a = [(i,j) for i in range(1,3) for j in range(1,4)] print(a) #[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)] -
练习:
#分组一个list里面的元组,比如[1,2,3,...,100]变成[[1,2,3],[4,5,6],...] list1 = [i for i in range(1,101)] print(list1) list2 = [list1[start:start + 3] for start in range(0,len(list1) - 1,3)] print(list2)
七.列表的操作综合应用
'''
王者荣耀角色管理
角色:姓名,性别,职业
添加角色
删除角色
修改角色
查询角色 单个查询
显示所有角色
退出系统
'''
import time
print('~~~~~~~~~~欢迎来到王者荣耀~~~~~~~~~~~')
allRoles = []
while True:
print('\n\n~~~~~~~~~~~~~选择界面~~~~~~~~~~~~~~~')
choice = int(input('1.添加角色\n2.删除角色\n3.修改角色\n4.查询角色\n5.显示所有角色\n6.退出系统\n'))
if choice == 1:
print('~~~~~~~~~~添加角色~~~~~~~~~~~')
name = input('角色姓名:')
gender = input('角色性别:')
occupation = input('角色职业:')
role = [name,gender,occupation]
allRoles.append(person)
print('~~~~~~~~~~{}添加成功~~~~~~~~~~~\n'.format(name))
elif choice == 2:
print('~~~~~~~~~~删除角色~~~~~~~~~~~')
delName = input('请输入你要删除的角色姓名:')
for role in allRoles:
if delName in role:
index = allRoles.index(role)
allRoles.pop(index)
print('~~~~~~~~~~删除成功~~~~~~~~~~~\n')
break
else:
print('未找到此角色')
elif choice == 3:
print('~~~~~~~~~~修改角色~~~~~~~~~~~')
delName = input('请输入你要修改的角色姓名:')
for role in allRoles:
if role[0] == delName:
while True:
change = input('请输入要修改的内容:')
if change == '姓名':
cName = input('修改名称为:')
role[0] = cName
break
elif change == '性别':
cgender = input('修改性别为:')
role[1] = cgender
break
elif change == '职业':
coccupation = input('修改职业为:')
role[2] = coccupation
break
else:
print('未找到此内容,重新输入!\n')
print('~~~~~~~~~~修改成功~~~~~~~~~~~\n')
break
else:
print('未找到此角色')
elif choice == 4:
print('~~~~~~~~~~查询角色~~~~~~~~~~~')
delName = input('请输入你要查询的角色姓名:')
for role in allRoles:
if role[0] == delName:
print('姓名\t性别\t职业\t')
print('{}\t{}\t{}'.format(role[0],role[1],role[2]))
break
else:
print('未找到此角色')
elif choice == 5:
print('~~~~~~~~~~显示所有角色~~~~~~~~~~~')
print('姓名\t性别\t职业\t')
for role in allRoles:
print('{}\t{}\t{}'.format(role[0],role[1],role[2]))
elif choice == 6:
print('正在退出....')
time.sleep(3)
print('再见召唤师!')
break
else:
print('没有找到该选项请重新输入!\n')

浙公网安备 33010602011771号