列表的基本操作

列表的基本操作包括:索引取值、切片、添加元素(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]

有关生成列表相关方法在性能上的测试

我在这篇博客详细介绍了生成列表的一些方法在性能上的测试记录:

Python内置数据类型list各方法的性能测试

实际中使用列表的一个坑

我在写业务代码的时候发现过一个关于列表的问题,记录在了这篇文章中:

Python可变数据类型list填坑一则

列表有关的几个小练习

自己平时写代码时总结的一些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']}
"""