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:
- for循环是按照位置指针来实现依次循环的。
- 在循环计数中,for循环的指针先执行0号位的'赵敏', 判断不符合后,在把指针指向1号位的'张绍刚'。这时'张绍刚'符合判定条件
startswith("张"):,因此执行了lst.remove(item)操作。在执行删除操作后,1号位立即为空,原本是(2号位'张无忌', 3号位''武则天', 4号位''嬴政', 5号位''马超')都立即变成了(1号位'张无忌', 2号位''武则天', 3号位''嬴政', 4号位''马超')。 - 此后for循环需要继续向下操作,将指针指向后面的2号位''武则天', 反复以上动作顺序向下操作。3号位''嬴政', 4号位''马超'
- 原本是2号位'张无忌',却因为变成了1号位被for循环跳过了执行。
- 因此'张无忌'没有被删除。
因此,在行业标准中,我们默认不会直接对原列表进行循环删除操作。
安全稳妥的循环删除方式是:将要删除的内容保存在一个新列表中。然后再用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)
这是列表推导式的一个常见用法,用于根据特定条件筛选和转换列表中的元素,并且列表的原名称不变。
执行过程解析:
- 遍历原始列表
lst中的每个元素item。 - 对于每个元素
item,检查是否以 "张" 开头。- 如果
item以 "张" 开头,条件item.startswith("张")为真。 - 如果
item不以 "张" 开头,条件item.startswith("张")为假。
- 如果
- 如果条件为假,将该元素
item添加到新的列表中。 - 继续遍历原始列表中的下一个元素,重复步骤 2 和步骤 3。
- 当完成遍历整个原始列表后,生成完整的新列表,这个新列表未命名。
- 把这个新列表赋值给lst[]列表
所以最终,原始列表 lst 已被修改,它现在包含了不以 "张" 开头的元素。
Python——第二章:列表的增、删、改、查的更多相关文章
- python基础中的四大天王-增-删-改-查
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- Python 第二章-列表和元组
第二章-列表和元组 2.0 在Python中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序列号-即元素的位置, 也称为索引.第一个索引是0,第二个是1,以此类推. ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- day 37-8 关于mysql 的增 删 改 查 及联合列表
1 VARCHAR : 字符串的意思 (括号内的数字代表尾数) 输入的字符串在这个范围内都行 CHAR :字符串的意思(区别就有几位数字 必须写几位) INT 整数(位数) 输入的数字 ...
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
随机推荐
- numpy 中的nan和常用的统计方法
- Ds100p -「数据结构百题」51~60
纪念 数据结构一百题50题了呢,该过半周年啦~~~~ LYC和WGY半年的努力让这个几乎玩笑一般的系列到了现在. 今后也请多多关照啦. 祝愿dp100p早日过半 51.CF1000F One Occu ...
- Hyper-V安装Ubuntu16.04,连接网络的设置
使用Windows10自带的Hyper-V安装Ubuntu. 进入系统界面后,无法连接网络. 1.首先确定安装虚拟机的网络设置 2.在Wlan属性分享页面中选取对应的网络设置,然后回到属性页面勾选Hy ...
- Oracle字符串函数-Translate()总结
Oracle的Translate(expr,from_string,to_string)是字符串操作函数,实现from_string,to_string字符的一 一替换 1)典型示例: select ...
- 【WPF】单例软件实现自重启
原文地址 https://www.cnblogs.com/younShieh/p/17749694.html 如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~ 在WPF应用程序中 ...
- 【ZT】关于字符集
utf8 全包容了gbk ,并不是说超集和子集:8i 的数据库 的 utf8 是 4位定长的字符编码:9i 和以上数据库的utf8 有4位定长AL32UTF8和 不定长的 UTF8 ,都是 ...
- oracle RAC redhat
RAC比较严格,如果操作系统不纯净,容易失败: 装备第一台VM:chkconfig sendmail offchkconfig iptables offchkconfig ip6talbes offs ...
- 长程 Transformer 模型
Tay 等人的 Efficient Transformers taxonomy from Efficient Transformers: a Survey 论文 本文由 Teven Le Scao.P ...
- JavaScript(ES6):变量的解构赋值
解构赋值定义: 允许按照一定模式从数组或对象中提取值,然后对变量进行赋值. 数组的解构赋值 注:数组的元素要一次排序的,变量的值由他的位置决定. 基本用法 // ES6 解构赋值 let [a, b, ...
- 在keil MDK中定义非初始化(noini)变量
具体 可以参考ARM官方资料:ARM: Uninialized Variables Get Initialized 这里是对上述资料的总结, 该方法已在项目中得到验证. 方法: 分散加载文件如下: 定 ...