列表就是一组有序的数据组合,列表中的数据可以被修改
列表[开始索引:结束索引:步进值]
示例:
varlist = ['刘德华','张学友','张国荣','黎明','郭富城','小沈阳','刘能','宋小宝','赵四'] # 从开始索引到列表的最后 res = varlist[2:] # ['张国荣','黎明','郭富城','小沈阳','刘能','宋小宝','赵四'] # 从开始到指定的结束索引之前 res = varlist[:2] # ['刘德华','张学友'] # 从开始索引到指定结束索引之前 res = varlist[2:6] # ['张国荣', '黎明', '郭富城', '小沈阳'] # 从指定索引开始到指定索引前结束,按照指定步进进行取值切片 res = varlist[2:6:2] # ['张国荣', '郭富城'] # 所有列表元素的切片 res = varlist[:] res = varlist[::] # 倒着输出列表的元素 res = varlist[::-1] # 使用切片方法 对列表数据进行更新和删除 print(varlist) # 从指定下标开始,到指定下标前结束,并替换为对应的数据(容器类型数据,会拆分成每个元素进行赋值) # varlist[2:6] = ['a','b','c',1,2,3] # varlist[2:6:2] = ['a','b'] # 需要与要更新的元素个数对应 # 切片删除 # del varlist[2:6] del varlist[2:6:2]
varlist = ['刘德华','张学友','张国荣','张学友','黎明','郭富城','小沈阳','刘能','宋小宝','赵四'] # len() 检测当前列表的长度,列表中元素的个数 res = len(varlist) # count() 检测当前列表中指定元素出现的次数 res = varlist.count('张学友') # append() 向列表的尾部追加新的元素,返回值为 None varlist.append('川哥') # insert() 可以向列表中指定的索引位置添加新的元素, varlist.insert(20,'aa') # pop() 可以对指定索引位置上的元素做 出栈 操作,返回出栈的元素 res = varlist.pop() # 默认会把列表中的最后一个元素 出栈 res = varlist.pop(2) # 会在列表中把指定索引的元素进行 出栈 varlist = [1,2,3,4,11,22,33,44,1,2,3,4] # remove() 可以指定列表中的元素 进行 删除,只删除第一个。如果没有找到,则报错 res = varlist.remove(1) # index() 可以查找指定元素在列表中第一次出现的索引位置 # res = varlist.index(1) # res = varlist.index(1,5,20) # 可以在指定索引范围内查找元素的索引位置 # extend() 接收一个容器类型的数据,把容器中的元素追加到原列表中 # varlist.extend('123') # s.clear() # 清空列表内容 # varlist.clear() # reverse() 列表翻转 varlist.reverse() # sort() 对列表进行排序 res = varlist.sort() # 默认对元素进行从小到大的排序 res = varlist.sort(reverse=True) # 对元素进行从大到小的排序 res = varlist.sort(key=abs) # 可以传递一个函数,按照函数的处理结果进行排序
使用copy函数后,新列表中的多维列表或容器与原列表使用同一地址。即改变一处,则新旧列表中均改变
# 浅拷贝 只能拷贝当前列表,不能拷贝列表中的多维列表元素 varlist = [1,2,3] # 简单的拷贝 就可以把列表复制一份 newlist = varlist.copy() # 对新拷贝的列表进行操作,也是独立的 del newlist[1] # print(varlist,id(varlist)) # print(newlist,id(newlist)) ''' [1, 2, 3] 4332224992 [1, 3] 4332227552 ''' # 多维列表 varlist = [1,2,3,['a','b','c']] # 使用copy函数 拷贝一个多维列表 newlist = varlist.copy() ''' print(newlist,id(newlist)) print(varlist,id(varlist)) [1, 2, 3, ['a', 'b', 'c']] 4361085408 [1, 2, 3, ['a', 'b', 'c']] 4361898496 ''' # 如果是一个被拷贝的列表,对它的多维列表元素进行操作时,会导致原列表中的多维列表也发生了变化 del newlist[3][1] ''' 通过id检测,发现列表中的多维列表是同一个元素(对象) print(newlist[3],id(newlist[3])) print(varlist[3],id(varlist[3])) ['a', 'c'] 4325397360 ['a', 'c'] 4325397360 '''
解决浅拷贝的问题,均使用新地址
使用copy模块中的 deepcopy 函数可以完成深拷贝
# 深拷贝 就是不光拷贝了当前的列表,同时把列表中的多维元素也拷贝了一份 import copy varlist = [1,2,3,['a','b','c']] # 使用 copy模块中 深拷贝方法 deepcopy newlist = copy.deepcopy(varlist) del newlist[3][1] print(varlist) print(newlist) ''' print(newlist[3],id(newlist[3])) print(varlist[3],id(varlist[3])) ['a', 'c'] 4483351248 ['a', 'b', 'c'] 4483003568 '''
List-Comprehensions
列表推导式提供了一个更简单的创建列表的方法。
常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列。
采用一种表达式的当时,对数据进行过滤或处理,并且把结果组成一个新的列表
结果变量 = [变量或变量的处理结果 for 变量 in 容器类型数据]
示例:
# 1 假设我们想创建一个平方列表 # 使用普通方法完成 varlist = [] for i in range(10): varlist.append(i**2) # print(varlist) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 使用 map函数和list完成 varlist = list(map(lambda x: x**2, range(10))) # print(varlist) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 使用列表推到式完成 下面这个列表推到式和第一种方式是一样的 varlist = [i**2 for i in range(10)] # print(varlist) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 2。 '1234' ==> [2,4,6,8] # 常规方法完成需求 varstr = '1234' newlist = [] for i in varstr: newlist.append(int(i)*2) # print(newlist) # [2, 4, 6, 8] # 使用列表推到式完成上面的需求 newlist = [int(i)*2 for i in varstr] # print(newlist) # [2, 4, 6, 8] # 使用列表推到式+位运算完成 newlist = [int(i) << 1 for i in varstr] # print(newlist) # [2, 4, 6, 8]
结果变量 = [变量或变量的处理结果 for i in 容器类型数据 条件表达式]
示例:
# 0-9 求所有的偶数,==> [0, 2, 4, 6, 8] # 常规方法完成 newlist = [] for i in range(10): if i % 2 == 0: newlist.append(i) # print(newlist) # [0, 2, 4, 6, 8] # 列表推到式完成 newlist = [i for i in range(10) if i % 2 == 0] # print(newlist) # [0, 2, 4, 6, 8]
''' # 下面这个 3x4的矩阵,它由3个长度为4的列表组成,交换其行和列 [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] ==> [ [1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12] ] ''' arr = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] # 常规方法完成 # newlist = [] # for i in range(4): # res = [] # for row in arr: # res.append(row[i]) # newlist.append(res) # print(newlist) # 使用列表推到式完成 newlist = [[row[i] for row in arr] for i in range(4)] print(newlist)
#行转列,列转行 arr = [ [1,2,3,4], [5,6,7,8], [9,8,10,11,12], ] newlist = [[row[i] for row in arr] for i in range(4)]
#使用列表推导式完成九九乘法表 list = [[f'{x}×{y}={x*y}' for y in range(1,x+1)] for x in range(1,10)] print(list)
# 字典转化为列表 vardic = {'user':'admin','age':20,'phone':'123'} varlist=[f'{i}={vardic[i]}' for i in vardic] print(varlist)
# 把列表中的所有字符全部转为小写 varlist = ['AAAAqA','bbbiubisAAAA','ccccccAAAAWQQE'] newlist=[i.lower() for i in varlist] print(newlist)
# x是0-5之间的偶数,y是0-5之间的奇数,把x,y组成元组放在列表中 varlist = [(i,j) for j in range(5) if j % 2!= 0 for i in range(5) if i % 2 ==0] print(varlist)
# 倒序实现九九乘法表 varlist = [[f'{i}×{j} = {i*j}' for j in range(1,i)] for i in range(9,0,-1)]