列表的基本操作
列表的基本操作包括:索引取值、切片、添加元素(insert、append、extend)、删除元素(pop、remove、clear、del)、修改、排序、取索引(index方法)、反转等等,我自己总结了下相关的练习代码:
列表切片的说明
# 模式[start:end:step]
"""
其中,第一个数字start表示切片开始位置,默认为0;
第二个数字end表示切片截止(但不包含)位置(默认为列表长度);
第三个数字step表示切片的步长(默认为1)。
当start为0时可以省略,当end为列表长度时可以省略,
当step为1时可以省略,并且省略步长时可以同时省略最后一个冒号。
另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行。
"""
aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print (aList[::]) # 返回包含原列表中所有元素的新列表
print (aList[::-1]) # 返回包含原列表中所有元素的逆序列表
print (aList[::2]) # 隔一个取一个,获取偶数位置的元素
print (aList[1::2]) # 隔一个取一个,获取奇数位置的元素
print (aList[3:6]) # 指定切片的开始和结束位置
aList[0:100] # 切片结束位置大于列表长度时,从列表尾部截断
aList[100:] # 切片开始位置大于列表长度时,返回空列表
aList[len(aList):] = [9] # 在列表尾部增加元素
aList[:0] = [1, 2] # 在列表头部插入元素
aList[3:3] = [4] # 在列表中间位置插入元素
aList[:3] = [1, 2] # 替换列表元素,等号两边的列表长度相等
aList[3:] = [4, 5, 6] # 等号两边的列表长度也可以不相等
aList[::2] = [0] * 3 # 隔一个修改一个
print (aList)
aList[::2] = ['a', 'b', 'c'] # 隔一个修改一个
print (aList)
#aList[::2] = [1,2] # 左侧切片不连续,等号两边列表长度必须相等
aList[:3] = [] # 删除列表中前3个元素
print (aList)
del aList[:3] # 切片元素连续
print (aList)
del aList[::2] # 切片元素不连续,隔一个删一个
demo1
l1 = ['Naruto','Sakurua','Sasukey','wanghw']
# 索引
print(l1[0],type(l1[0]))
print(l1[1],type(l1[1]))
# 切片
print(l1[:5],type(l1[:5]))
print(l1[0:4:2])
print(l1[-1:-4:-1])
# 列表的常用操作——增删改查
'''##增——insert、append、extend'''
###()append——追加
l1.append(['王宏伟',22,'male'])
print(l1)
###(2)insert——插入
l1.insert(1,'whw')
print(l1)
###(3)extend——迭代追加
l1.extend('Alex')
print(l1)#
'''删——pop、remove、clear、del'''
###()按照索引去删——pop()
###只有pop()会将被删除的元素返回
ret = l1.pop(0)
print('被删除的元素',ret)
print(l1)
###(2)按照元素删除——remove()
###如果有同名的元素,则会只删除第一个
l1.append('A')
print(l1)
l1.remove('A')
print(l1)
###(3)清空列表
l3 = [1,2,3,4,5]
print(l3)
l3.clear()
print(l3,type(l3))
###(4)del——————
###(4-)按照索引删除
del l1[-2]
print(l1)
###(4-2)按照切片(可以加步长)删除
del l1[1:5:2]
print(l1)
###(4-3)删除整个列表
l4 = [1,2,3]
print(l4)
del l4
# print(l4)# 报错:NameError: name 'l4' is not defined
''''#改—— l1[0]=* l1[:3]="wanghw" l1[:4:2]=222,333 '''
l1[0] = 'hero'
print(l1)
l1[:3] = 'WhwEa'
print(l1)
##按照步长添加,元素的个数必须与索引个数一一对应
l1[:4:2] = 222,333
print(l1)
# 查
'''
###(1)按照索引
###(2)按照切片+步长
###(3)for循环
'''
# 其他方法:len、count、index、sort、reverse
###len——获取列表长度
print(len(l1))
###count——计算某个元素出现的次数
print(l1.count('a1'))
###index——通过元素返回索引
# ——找到第一个就返回,找不到就报错
###sort——排序——默认从小到大
l11 = [1,4,3,2,6,5,11,9]
l12 = [1,4,3,2,6,5,11,9]
l11.sort()
print(l11)
l12.sort(reverse=True)
print(l12)
###reverse——反转
l13 = ['a1','b','c','d']
l13.reverse()
print(l13)#['d', 'c', 'b', 'a1']
demo2
# 创建一个从1到9的列表
list1 = list(range(1,10))
print(list1)
list2 = ['a1','b','c',1,2,3]
# 查找元素对应的下标,没有则报错
print(list2.index(3))
# 查找元素的个数,没有则是0
print(list2.count('d'))
# 切片——左闭右开区间——“顾头不顾尾”
print(list2[1:2]) #['b']
print(list2[0:-1])#['a1', 'b', 'c', 1, 2]
print(list2[:])
print(list2[::2])#['a1', 'c', 2]
print(list2[1::2])#['b', 1, 3]
# 增加——append、insert、extend
list1.append('w')
print(list1)
list1.insert(0,'h')
print(list1)
list1.extend(list2)
print(list1)
# 删除——pop、remove、del
list1.pop()#默认删除最后一个
print(list1)
list1.pop(-1)
print(list1)
list1.remove('h')
print(list1)
#没有的话会报错
# ValueError: list.remove(x): x not in list
#list1.remove('ww')
# del list2 将列表彻底删掉
#先 del list2 再print(list2)的话会报错,提示list2not defined
del list1[2:5]
print(list1)
##clear
# list2.clear() 清空列表,得到一个空列表
#遍历————for....与enumerate配合
count = 0
for i in list2:
count += 1
print(count,len(list2))
for i,v in enumerate(list2,1):
print(i,v)
# 排序——sort()——————反转——reverse()
##注意sort()方法 reverse参数:默认为False:正序,若指定为True:逆序
list3 = [2,32,11,55,0,1,-1]
list3.sort(reverse=True)
print(list3)#[-1, 0, 1, 2, zz, 32, 55]
list3.reverse()
print(list3)#[55, 32, zz, 2, 1, 0, -1]
##按照格式打印商品列表
products = [['iphon10',10000],['MacPro',16666],['小米16',1555],['Coffee',23],['Book',12]]
print('商品列表'.center(20,'*'))
for i,v in enumerate(products,1):
print(str(i)+'.',v[0],v[1])
列表生成式
列表的推导式又叫列表生成式,列表的生成式生成列表的效率是最高的,实际中大家尽量使用列表的推导式:
lst = [1,2,3,4,5]
lst2 = [i**2 for i in lst]
print(lst2)
'''
[1,4,9,16,25]
'''
删除列表中的元素1
实际中在使用遍历的方式删除列表中的元素的时候一定要倒序遍历
。
正序遍历kennel会漏掉一些数据
### 删除其中小于10的数据
## 正序遍历删除会丢掉一些数据
lst1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
for i in lst1:
if i < 10:
lst1.remove(i)
print("lst1>>>",lst1) # lst1>>> [2, 4, 6, 8, 10, 11, 12, 13, 14, 15]
lst2 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
for i,v in enumerate(lst2):
if v < 10:
del lst2[i]
print("lst2>>>",lst2) # lst2>>> [2, 4, 6, 8, 10, 11, 12, 13, 14, 15]
倒序遍历
lst1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
for i in lst1[::-1]:
if i < 10:
lst1.remove(i)
print("lst1>>>",lst1) # lst1>>> [10, 11, 12, 13, 14, 15]
可以使用filter或者列表生成式
# filter方法
lst1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
lst2 = list(filter(lambda x:x>=10,lst1))
print(lst2) # [10, 11, 12, 13, 14, 15]
# 列表推导式
lst1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
lst2 = [i for i in lst1 if i >= 10]
print(lst2) # [10, 11, 12, 13, 14, 15]
删除列表中的元素2
'''#删除偶数索引位置的元素'''
l1 = [11,22,33,44,55,66]
l2 = [11,22,33,44,55,66]
l3 = [11,22,33,44,55,66]
#方法一:
del l1[::2]
print(l1)
#方法二:
for i in range(len(l2)-1,-1,-1):
if i % 2 == 0:
l2.pop(i)
print(l2)
列表正负数的排序
lst = [1, -2, 10, -12, -4, -5, 9, 2]
# 将列表进行排序,正数在前,负数在后,并且分别按绝对值从小到大
lst.sort(key=lambda x:(x<0,abs(x)))
print(lst) # [1, 2, 9, 10, -2, -4, -5, -12]
list的sort与reverse方法是对源列表的修改
list的sort与reverse方法是对源列表的修改,并没有生成新的对象!
l = [1,2,3,0]
ll = l.reverse()
print(ll)#None
print(l)#[0, 3, 2, 1]
l2 = l.sort()
print(l2)#None
print(l)#[0, 1, 2, 3]
有关生成列表相关方法在性能上的测试
我在这篇博客详细介绍了生成列表的一些方法在性能上的测试记录:
实际中使用列表的一个坑
我在写业务代码的时候发现过一个关于列表的问题,记录在了这篇文章中:
列表有关的几个小练习
自己平时写代码时总结的一些demo
列表当作函数默认参数的坑1
def add(a, b):
a += b
return a
class Company:
def __init__(self, name, staffs=[]):
self.name = name
self.staffs = staffs
def add(self, staff_name):
self.staffs.append(staff_name)
def remove(self, staff_name):
self.staffs.remove(staff_name)
if __name__ == "__main__":
# 初始化的时候指定staffs列表的话,用传入的这个列表
com1 = Company("com1", ["whw1", "whw2"])
com1.add("whw3")
com1.remove("whw1")
print(com1.staffs) # ['whw2', 'whw3']
# 初始化的时候不指定staffs的话,用默认的哪个列表!—— 可能会与其他不指定staffs的对象用同一个列表!
com2 = Company("com2")
com2.add("whw")
print(com2.staffs) # ['whw']
print("default>>",Company.__init__.__defaults__) # default>> (['whw'],)
com3 = Company("com3")
com3.add("whw5")
print (com2.staffs) # ['whw', 'whw5']
print (com3.staffs) # ['whw', 'whw5']
print (com2.staffs is com3.staffs) # True
列表作为默认参数的坑2
""" 一 """
# 列表作为默认参数
def lst_func(name:str,age:int,default_lst=[])->dict:
default_lst.append(name)
dic = dict(
name=name,
age=age,
lst=default_lst,
)
return dic
# 使用默认的default使用的是同一个默认的列表
test1 = lst_func("naruto",28)
test2 = lst_func("sasuke",38)
# 指定default_lst
test3 = lst_func("whw",18,default_lst=[])
# print("test1>>>>>>>",test1)
# print("test2>>>>>>>",test2)
# print("test3>>>>>>>",test3)
"""
test1>>>>>>> {'name': 'naruto', 'age': 28, 'lst': ['naruto', 'sasuke']}
test2>>>>>>> {'name': 'sasuke', 'age': 38, 'lst': ['naruto', 'sasuke']}
test3>>>>>>> {'name': 'whw', 'age': 18, 'lst': ['whw']}
"""
""" 二 """
# 使用clear方法 “重置”列表
def lst_func(name:str,age:int,default_lst=[])->dict:
# clear之后,实际上还是使用的是同一个列表
default_lst.clear()
default_lst.append(name)
dic = dict(
name=name,
age=age,
lst=default_lst,
)
return dic
test1 = lst_func("naruto",28)
test2 = lst_func("sasuke",38)
test3 = lst_func("whw",18,default_lst=[])
# print("test1>>>>>>>",test1)
# print("test2>>>>>>>",test2)
# print("test3>>>>>>>",test3)
"""
test1>>>>>>> {'name': 'naruto', 'age': 28, 'lst': ['naruto', 'sasuke']}
test2>>>>>>> {'name': 'sasuke', 'age': 38, 'lst': ['naruto', 'sasuke']}
test3>>>>>>> {'name': 'whw', 'age': 18, 'lst': ['whw']}
"""
""" 三 """
# 不指定在函数内部生成一个新的列表
def lst_func(name:str,age:int,default_lst=[])->dict:
# 指向一个新列表
default_lst = []
default_lst.append(name)
dic = dict(
name=name,
age=age,
lst=default_lst,
)
return dic
test1 = lst_func("naruto",28)
test2 = lst_func("sasuke",38)
test3 = lst_func("whw",18,default_lst=[])
print("test1>>>>>>>",test1)
print("test2>>>>>>>",test2)
print("test3>>>>>>>",test3)
"""
test1>>>>>>> {'name': 'naruto', 'age': 28, 'lst': ['naruto']}
test2>>>>>>> {'name': 'sasuke', 'age': 38, 'lst': ['sasuke']}
test3>>>>>>> {'name': 'whw', 'age': 18, 'lst': ['whw']}
"""