首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python3中的列表操作

1:列表的定义及特性

列表是一种有序集合数据类型,列表可以包含任何类型的对象(数字,字符串,列表,字典等等),列表是可变对象类型,支持在原位置修改操作。列表具有如下特性:

a:任意对象的有序集合,它可变长度,能够任意嵌套。

b:可通过偏移访问。

c:属于“可变系列”的分类。

d:列表是对象引用数组

lst = ['中', '华', '人', '民', '共', '和', '国'] 的赋值过程如下图:

2:常用列表字面量及操作

2.1常用列表字面量及操作汇总

2.2列表的索引与切片

2.2.1列表的索引

列表是有序序列,与字符串一样,也支持索引下标访问,并且支持通过下标修改;

索引访问:

索引为正数:

lst = ['中', '华', '人', '民', '共', '和', '国']print('lst=',lst,'\nlen(lst)=',len(lst))print('lst[0]=',lst[0])print('lst[1]=',lst[1])print('lst[2]=',lst[2])print('lst[3]=',lst[3])print('lst[4]=',lst[4])print('lst[5]=',lst[5])print('lst[6]=',lst[6])print('lst[7]=',lst[7])

"""输出结果:lst= ['中', '华', '人', '民', '共', '和', '国'] len(lst)= 7lst[0]= 中lst[1]= 华lst[2]= 人lst[3]= 民lst[4]= 共lst[5]= 和lst[6]= 国Traceback (most recent call last): File "D:\python\列表.py", line 14, in print('lst[7]=',lst[7])IndexError: list index out of range"""

也支持索引为负数:

lst = ['中', '华', '人', '民', '共', '和', '国']print('lst=',lst,'\nlen(lst)=',len(lst))print('lst[-1]=',lst[-1])print('lst[-2]=',lst[-2])print('lst[-3]=',lst[-3])print('lst[-4]=',lst[-4])print('lst[-5]=',lst[-5])print('lst[-6]=',lst[-6])print('lst[-7]=',lst[-7])

"""输出结果:lst= ['中', '华', '人', '民', '共', '和', '国'] len(lst)= 7lst[-1]= 国lst[-2]= 和lst[-3]= 共lst[-4]= 民lst[-5]= 人lst[-6]= 华lst[-7]= 中"""

2.2.2列表的切片:

与字符串一样,列表也支持切片操作:语法一样。

语法: str[start: end:step]      start默认为0,end默认为字符长度,step默认为1

  start: 起始位置

end: 结束位置

step:步长

规则: 顾头不顾尾, 从start开始截取. 截取到end位置. 但不包括end

step为步长: 如果是正数, 则从左往右取. 如果是负数. 则从右往左取. 默认是1;

先上图:

代码:

print('*' * 30)lst = ['中', '华', '人', '民', '共', '和', '国']print('lst=',lst,'\nlen(lst)=',len(lst)) # 不带参数print('lst[::2]=',lst[::2]) #截取 下标0开始,右边的所有元素,相当于复制了整个列表# 默认 0开始print('lst[:]=',lst[:]) #截取 下标-1开始,左边的所有元素,相当于复制了反转之后的列表#默认 -1开始print('lst[::-1]=',lst[::-1]) # 截取 下标为2开始右边的所有元素,结束位置默认为列表的长度print('lst[2:]=',lst[2:])# 截取 下标为2开始左边的所有元素,print('lst[2::-1]=',lst[2::-1]) # 截取 下标为2开始右边的,直到下标5结束的所有元素(不包下标5的元素)print('lst[2:5]=',lst[2:5]) # 截取 下标为2开始左边的,直到下标5结束的所有元素;结果为[],因为下标2左边的下标均小于2,故不可能到达下标5print('lst[2:5:-1]=',lst[2:5:-1]) # 截取 下标0开始,右边,直到下标为5结束的所有元素(不包下标5的元素);print('lst[:5]=',lst[:5]) # 截取 下标-1开始,左边,直到下标为5结束的所有元素(不包下标5的元素);开始位置默认为-1print('lst[:5:-1]=',lst[:5:-1]) print('*' * 30)

结果:

******************************lst= ['中', '华', '人', '民', '共', '和', '国'] len(lst)= 7lst[::2]= ['中', '人', '共', '国']lst[:]= ['中', '华', '人', '民', '共', '和', '国']lst[::-1]= ['国', '和', '共', '民', '人', '华', '中']lst[2:]= ['人', '民', '共', '和', '国']lst[2::-1]= ['人', '华', '中']lst[2:5]= ['人', '民', '共']lst[2:5:-1]= []lst[:5]= ['中', '华', '人', '民', '共']lst[:5:-1]= ['国']******************************

2.3列表的增删改查

列表是可变数据类型,因此可以进行增删改操作:

2.3.1:列表的增加操作:

# 新增# 1:append,每次都在末尾添加元素lst = []lst.append('林志颖')lst.append('张学友')lst.append('刘德华')lst.append('张柏芝')print('1:',lst) # 输出 ['林志颖', '张学友', '刘德华', '张柏芝'] # 2:insertlst = ['林志颖', '张学友', '刘德华', '张柏芝']lst.insert(2, '周杰伦') # 在2号位置插入,即在'刘德华'位置插入,'刘德华'及后面的数据向后移动;插入的时候,可能会导致元素移动print('2:',lst) # ['林志颖', '张学友', '周杰伦', '刘德华', '张柏芝'] # 3:迭代添加:extendlst = ['刘德华', '张柏芝']lst.extend('林志颖') # 字符串为可迭代对象,会把字符串中的每个字符添加到列表中,输出: ['刘德华', '张柏芝', '林', '志', '颖']print('3:',lst)lst.extend(['张学友']) # 迭代列表, 输出['刘德华', '张柏芝', '林', '志', '颖', '张学友']print('4:',lst)

结果:

1: ['林志颖', '张学友', '刘德华', '张柏芝']2: ['林志颖', '张学友', '周杰伦', '刘德华', '张柏芝']3: ['刘德华', '张柏芝', '林', '志', '颖']4: ['刘德华', '张柏芝', '林', '志', '颖', '张学友']

2.3.2:列表的删除操作:

#删除: pop,remove,clear,del# 1:pop : 按照索引来删除,默认删除最后一个lst = ['林志颖', '张学友', '刘德华', '张柏芝']s = lst.pop() # 默认弹出最后一个,可以指定元素(索引)删除;返回删除的元素print('1=',s) # 张柏芝print('2=',lst) # ['林志颖', '张学友', '刘德华']lst = ['林志颖', '张学友', '刘德华', '张柏芝']s2 = lst.pop(1) # 输出1号为元素('张学友'), 输出:['林志颖', '刘德华', '张柏芝']print('3=',lst) # 2: remove,按照元素值来删除,删除时元素值要存在于列表中,不然会报错lst = ['林志颖', '张学友', '刘德华', '张柏芝']lst.remove('林志颖') # 指定元素(元素值) 输出 : ['张学友', '刘德华', '张柏芝']print('4=',lst)# lst.remove('费玉清') # 报错 ValueError: list.remove(x): x not in list# print(lst) # 3:clear,全部清空元素,但是列表还是存在的,只是为空而已。lst = ['林志颖', '张学友', '刘德华', '张柏芝']print('5=',lst,id(lst))lst.clear() # 元素全部清空,[]print('6=',lst,id(lst)) # 4:del 输出,指定索引来删除,也可以切片删除(即指定删除范围)lst = ['林志颖', '张学友', '刘德华', '张柏芝']del lst[1] # 指定元素(索引);['林志颖', '刘德华', '张柏芝']print('7=',lst) #可以切片删除lst = ['林志颖', '张学友', '刘德华', '张柏芝']del lst[0:2] # 指定删除范围,输出:['刘德华', '张柏芝']print('8=',lst) lst = ['林志颖', '张学友', '刘德华', '张柏芝']lst[0:1] = [] print('9=',lst)

结果:

1= 张柏芝2= ['林志颖', '张学友', '刘德华']3= ['林志颖', '刘德华', '张柏芝']4= ['张学友', '刘德华', '张柏芝']5= ['林志颖', '张学友', '刘德华', '张柏芝'] 20856558576086= [] 20856558576087= ['林志颖', '刘德华', '张柏芝']8= ['刘德华', '张柏芝']9= ['张学友', '刘德华', '张柏芝']

2.3.3:列表的修改操作:

# 修改里面的元素lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']print('1=',lst)# 通过单个索引来修改lst[2] = '梁咏琪'print('2=',lst) # ['林志颖', '张学友', '梁咏琪', '张柏芝', '黄家驹', '周杰伦'] lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']lst[-3] = '蜘蛛侠3'print('3=',lst) # ['林志颖', '张学友', '刘德华', '蜘蛛侠3', '黄家驹', '周杰伦'] # 通过切片来修改lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']lst[1:3] = '男儿本色'print('4=',lst) #会迭代字符串 ['林志颖', '男', '儿', '本', '色', '张柏芝', '黄家驹', '周杰伦'] lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']lst[1:3] = ['男儿本色']print('5=',lst) # ['林志颖', '男儿本色', '张柏芝', '黄家驹', '周杰伦'] # lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']# lst[1:5:2] = ['男儿本色'] #报错 ValueError: attempt to assign sequence of size 1 to extended slice of size 2# print(lst) lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']lst[1:5:2] = ['男儿本色','男儿本色2'] # 注意如果元素的步长不是1,那么元素的个数要匹配print('6=',lst) # ['林志颖', '男儿本色', '刘德华', '男儿本色2', '黄家驹', '周杰伦']

结果:

1= ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']2= ['林志颖', '张学友', '梁咏琪', '张柏芝', '黄家驹', '周杰伦']3= ['林志颖', '张学友', '刘德华', '蜘蛛侠3', '黄家驹', '周杰伦']4= ['林志颖', '男', '儿', '本', '色', '张柏芝', '黄家驹', '周杰伦']5= ['林志颖', '男儿本色', '张柏芝', '黄家驹', '周杰伦']6= ['林志颖', '男儿本色', '刘德华', '男儿本色2', '黄家驹', '周杰伦']

2.3.4:列表的查询操作:

# 列表是一个可迭代对象# 列表的查询(或者说遍历)lst = ['林志颖', '张学友', '刘德华', '张柏芝', '黄家驹', '周杰伦']for item in lst: print(item) for index,item in enumerate(lst): print(index,item)

2.4:列表的常用函数

# 查看列表的所有函数# print(dir(list))print([item for item in dir(list) if not item.startswith('__') ])# print(help(list.index))# 结果 ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] # list.count(元素) ;元素个数,第一层元素的个数,不比较子元素中的值lst = [1,2,33,2,2,1,3,[2,1,3]]print('1--lst=',lst)print('2--lst.count(2)=',lst.count(2)) # 元素在指定范围第一次出现的位置print('3--lst.index(2,2,)=',lst.index(2,2,)) # 排序,lst = [7, 4, 9, 2,19,12]# print(lst,id(lst))lst.sort() print('4--lst.sort() -->',lst,id(lst)) # 降序lst = [7, 4, 9, 2,19,12]# print(lst,id(lst))lst.sort(reverse=True) # 降序print('5--lst.sort(reverse=True) -->',lst) #列表中元素的反转lst = [7, 4, 9, 2,19,12]# print(lst)lst.reverse()print('6--lst.reverse() -->',lst) # 复制列表lst = [7, 4, 9, 2,19,12]print(lst,id(lst))lst2= lst.copy()print(lst2,id(lst2))

2.5 列表的拷贝

Python中变量是对象的引用,把一个变量赋值给另外一个变量,其结果就是2个变量引用了一个相同的对象,他们指向了相同的对象。

lst1 = [1,2,3]lst2 = lst1 # lst1,lst2 都指向了相同的对象# id函数返回对象的内存地址(注意是对象的内存地址,而不是变量的),可使用 : print(help(id)) 查看说明;print(id(lst1),id(lst2)) # 输出的结果是一样的 ;2386431167624 2386431167624 (每次运行,这个地址的输出是不同的)print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [1, 2, 3] # 由于lst1,lst2指向相同的对象,对lst1,lst2中任意一个的修改,都会影响到另一个;lst2[0] = 100print('2---lst1=',lst1,'lst2=',lst2) # lst1= [100, 2, 3] lst2= [100, 2, 3] lst1[1] = 88print('3---lst1=',lst1,'lst2=',lst2) # lst1= [100, 88, 3] lst2= [100, 88, 3] """结果:2386431167624 23864311676241---lst1= [1, 2, 3] lst2= [1, 2, 3]2---lst1= [100, 2, 3] lst2= [100, 2, 3]3---lst1= [100, 88, 3] lst2= [100, 88, 3]"""

那么怎么拷贝列表的一份副本呢?

使用分片进行拷贝:

# 使用分片拷贝lst1 = [1,2,3]lst2 = lst1[:] # lst1,lst2 都指向了不同的对象# id函数返回对象的内存地址(注意是对象的内存地址,而不是变量的),可使用 : print(help(id)) 查看说明;print(id(lst1),id(lst2)) # 输出的结果是不一样的 ;2747197017224 2747197017288 (每次运行,这个地址的输出是不同的)print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [1, 2, 3] # 由于lst1,lst2指向不同的对象,对lst1,lst2中任意一个的修改,都不会影响到另一个;lst2[0] = 100print('2---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [100, 2, 3] lst1[1] = 88print('3---lst1=',lst1,'lst2=',lst2) # lst1= [1, 88, 3] lst2= [100, 2, 3] """2747197017224 27471970172881---lst1= [1, 2, 3] lst2= [1, 2, 3]2---lst1= [1, 2, 3] lst2= [100, 2, 3]3---lst1= [1, 88, 3] lst2= [100, 2, 3]"""

使用列表中的copy函数拷贝:

# 使用copy拷贝lst1 = [1,2,3]lst2 = lst1.copy() # lst1,lst2 都指向了不同的对象# id函数返回对象的内存地址(注意是对象的内存地址,而不是变量的),可使用 : print(help(id)) 查看说明;print(id(lst1),id(lst2)) # 输出的结果是不一样的 ;1734484479112 1734484479176 (每次运行,这个地址的输出是不同的)print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [1, 2, 3] # 由于lst1,lst2指向不同的对象,对lst1,lst2中任意一个的修改,都不会影响到另一个;lst2[0] = 100print('2---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [100, 2, 3] lst1[1] = 88print('3---lst1=',lst1,'lst2=',lst2) # lst1= [1, 88, 3] lst2= [100, 2, 3] """1734484479112 17344844791761---lst1= [1, 2, 3] lst2= [1, 2, 3]2---lst1= [1, 2, 3] lst2= [100, 2, 3]3---lst1= [1, 88, 3] lst2= [100, 2, 3]"""

深度拷贝:

# 使用copy拷贝,分片拷贝都存在一个问题,他们只能拷贝列表的顶层,# 如果列表中嵌套了列表等,那么就不能拷贝里面的列表。lst1 = [1,2,3,[4,5,6]]lst2 = lst1.copy() # lst1,lst2 都指向了不同的对象# id函数返回对象的内存地址(注意是对象的内存地址,而不是变量的),可使用 : print(help(id)) 查看说明;print(id(lst1),id(lst2)) # 输出的结果是不一样的 ;2278634146248 2278634147144 (每次运行,这个地址的输出是不同的) lst1[3][0] = 33 # 修改列表中嵌套的列表print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3, [33, 5, 6]] lst2= [1, 2, 3, [33, 5, 6]] print('*'*30)# 深度拷贝,需要引入一个模块import copylst1 = [1,2,3,[4,5,6],7]lst2 = copy.deepcopy(lst1)print(id(lst1),id(lst2)) # 输出的结果是不一样的 ;2278634571592 2278634146248 (每次运行,这个地址的输出是不同的) lst1[3][0] = 33 # 修改列表中嵌套的列表lst2[3][1] = 44 print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3, [33, 5, 6], 7] lst2= [1, 2, 3, [4, 44, 6], 7] """输出结果:2278634146248 22786341471441---lst1= [1, 2, 3, [33, 5, 6]] lst2= [1, 2, 3, [33, 5, 6]]******************************2278634571592 22786341462481---lst1= [1, 2, 3, [33, 5, 6], 7] lst2= [1, 2, 3, [4, 44, 6], 7]"""

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200719A0PLRZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券