Python——第二章:列表的增、删、改、查

列表的添加

.append()

lst = []
# 向列表末尾添加内容
# append() 追加
lst.append("张绍刚")
lst.append("赵本山")
lst.append("张无忌")
print(lst)
# insert() 在指定位置插入,原先该位置以后的所有元素都需要往后挪n个位置,因此插入的效率极低。
lst.insert(0, "赵敏")    #在第0个位置插入
print(lst)
# extend() 可以合并两个列表, 批量的添加
lst.extend(['武则天', "嬴政", "马超"])
print(lst)

输出结果 :

['张绍刚', '赵本山', '张无忌']
['赵敏', '张绍刚', '赵本山', '张无忌']
['赵敏', '张绍刚', '赵本山', '张无忌', '武则天', '嬴政', '马超']

列表的删除

无论是使用del命令,还是使用.remove()命令或者是.pop()命令,删除列表是对原列表直接进行操作,这与之前的字符串操作有很大区别

因此要连续操作,删除指定位置的元素,最好的操作方式是从后往前删,不然会改变实际元素位置的。

del lst删除整个lst列表

del lst[]删除列表中的元素

为了方便展示,我特意把元素按照本身位置进行了标记,请细细体会两者的差异,

lst = ['0', '1', '2', '3', '4', '5', '6']
# 依次删除指定索引位置的元素
del lst[5]  # 删除索引为5的元素
print(lst)
del lst[3]  # 删除索引为3的元素
print(lst)
del lst[1]  # 删除索引为1的元素
print(lst)

#结果是:
['0', '1', '2', '3', '4', '6']
['0', '1', '2', '4', '6']
['0', '2', '4', '6']

如果依次从前向后删除元素,删除后元素的位置会发生变化,列表的位数会缩短,命令甚至会超出。

# 删除
lst = ['0', '1', '2', '3', '4', '5', '6']
# 依次删除指定索引位置的元素
del lst[1]  # 删除索引为1的元素
print(lst)
del lst[3]  # 删除索引为3的元素
print(lst)
del lst[5]  # 删除索引为5的元素
print(lst)

#输出结果
['0', '2', '3', '4', '5', '6']
['0', '2', '3', '5', '6']
Traceback (most recent call last):
  File "D:\Python\列表\删除方法.py", line 43, in <module>
    del lst[5]  # 删除索引为5的元素
        ~~~^^^
IndexError: list assignment index out of range

del命令需要指定元素的索引位置,而.remove()命令可以规避这个溢出的问题。

使用.remove()命令进行删除,不需要知道列表的位置直接删除元素。

lst = ['赵敏', '张绍刚', '赵本山', '张无忌', '武则天', '嬴政', '马超']
lst.remove("马超")  # 删除某个元素
print(lst)

使用.pop()命令删除

pop() 是Python列表(list)的一个方法,用于删除并返回列表中的指定索引位置的元素。这个方法可以有一个可选的参数,用来指定要删除的元素的索引,如果默认不写是删除并返回列表中的最后一个元素(-1)。

语法:

returned = list.pop(index)
  • list:要操作的列表。
  • index:要删除的元素的索引。如果不提供索引,默认为 -1,即删除并返回列表中的最后一个元素。
  • returned:被删除的元素,也是被 pop() 返回的值。
fruits = ["apple", "banana", "cherry"]

# 删除并返回索引为1的元素
removed_fruit = fruits.pop(1)

print(removed_fruit)  # 输出: "banana"
print(fruits)         # 输出: ["apple", "cherry"]

pop() 方法会修改原始列表,并且返回被删除的元素,所以你可以选择将其赋值给一个变量以备后续使用。如果不提供索引参数,它将默认删除并返回最后一个元素。如果索引超出了列表的范围,将引发 IndexError 异常。

 

 # 修改

lst = ['赵敏', '张绍刚', '赵本山', '张无忌', '武则天', '嬴政', '马超']
lst[4] = "恺"  # 直接用索引就可以进行修改操作
print(lst)

#输出结果
['赵敏', '张绍刚', '赵本山', '张无忌', '恺', '嬴政', '马超']


# 查询

lst = ['赵敏', '张绍刚', '赵本山', '张无忌', '恺', '嬴政', '马超']
print(lst[4])  # 直接用索引进行查询操作

#输出结果
恺

 

小练习:把列表内所有的姓张的人修改成姓王,其余不变

lst = ['赵敏', '张绍刚', '张无忌', '武则天', '嬴政', '马超']

for i in range(len(lst)):  # len(lst)列表的长度 ->  可以直接拿到列表索引的for循环
    item = lst[i]  # item依然是列表中的每一项
    if item.startswith("张"):
        # 张绍刚
        new_name = "王"+item[1:]
        print(new_name)
        # 把新名字丢回列表(需要索引了?)
        lst[i] = new_name  # 修改

print(lst)

详细讲解可以参考range用法介绍

https://www.cnblogs.com/Magiclala/p/17774977.html

 

列表的循环删除(*)

错误操作

lst = ['赵敏', '张绍刚', '张无忌', '武则天', '嬴政', '马超']

for item in lst:
    if item.startswith("张"):
        lst.remove(item)  # 有bug
print(lst)

输出结果:

['赵敏', '张无忌', '武则天', '嬴政', '马超']

上面这个代码的目的是从一个列表中删除所有以"张"开头的元素。不过,这个代码在Python中有一个常见的问题。当你试图在迭代一个列表的同时修改它时,会出现一个错误。因为在迭代过程中修改列表会影响迭代器的状态。

在for循环的实现原理:for item in lst:

  1. for循环是按照位置指针来实现依次循环的。
  2. 在循环计数中,for循环的指针先执行0号位的'赵敏', 判断不符合后,在把指针指向1号位的'张绍刚'。这时'张绍刚'符合判定条件startswith("张"): ,因此执行了 lst.remove(item)操作。在执行删除操作后,1号位立即为空,原本是(2号位'张无忌', 3号位''武则天', 4号位''嬴政', 5号位''马超')都立即变成了(1号位'张无忌', 2号位''武则天', 3号位''嬴政', 4号位''马超')。
  3. 此后for循环需要继续向下操作,将指针指向后面的2号位''武则天', 反复以上动作顺序向下操作。3号位''嬴政', 4号位''马超'
  4. 原本是2号位'张无忌',却因为变成了1号位被for循环跳过了执行。
  5. 因此'张无忌'没有被删除。

因此,在行业标准中,我们默认不会直接对原列表进行循环删除操作。

安全稳妥的循环删除方式是:将要删除的内容保存在一个新列表中。然后再用for循环去提取新列表的每一个元素,去老列表中删除。

lst = ['赵敏', '张绍刚', '张无忌', '武则天', '嬴政', '马超']

temp = [] # 准备一个临时列表, 负责存储要删除的内容
for item in lst:
    if item.startswith("张"):
        temp.append(item)  # 把需要要删除的内容添加到temp列表中

for item in temp:
    lst.remove(item)  # 把temp列表中的元素,去原列表中进行删除操作,避开了位置索引的问题
print(lst)

 

还可以来创建一个新的列表,把原列表中不想删除的元素都添加过去。例如:

lst = ['赵敏', '张绍刚', '张无忌', '武则天', '嬴政', '马超']
temp = []
for item in lst:
    if not item.startswith("张"):
        temp.append(item)
print(temp)

还可以使用列表推导式来创建一个新的列表,该列表包含未被删除的元素。例如:

lst = ['赵敏', '张绍刚', '张无忌', '武则天', '嬴政', '马超']
lst = [item for item in lst if not item.startswith("张")]
print(lst)

这是列表推导式的一个常见用法,用于根据特定条件筛选和转换列表中的元素,并且列表的原名称不变。

 执行过程解析:

  1. 遍历原始列表 lst 中的每个元素 item
  2. 对于每个元素 item,检查是否以 "张" 开头。
    • 如果 item 以 "张" 开头,条件 item.startswith("张") 为真。
    • 如果 item 不以 "张" 开头,条件 item.startswith("张") 为假。
  3. 如果条件为假,将该元素 item 添加到新的列表中。
  4. 继续遍历原始列表中的下一个元素,重复步骤 2 和步骤 3。
  5. 当完成遍历整个原始列表后,生成完整的新列表,这个新列表未命名。
  6. 把这个新列表赋值给lst[]列表

所以最终,原始列表 lst 已被修改,它现在包含了不以 "张" 开头的元素。

posted @ 2023-10-19 16:48  Magiclala  阅读(145)  评论(0编辑  收藏  举报