python - 从列表中删除值
问题描述
我有以下问题:
我有一个清单:
temp= [950, 1000, 1100, 1200, 1400, 1450, 1500, 1600, 1650, 1700, 1900, 1950, 2000, 2100, 2200]
在这个列表中,我想删除每个< 1200 and > 1950
.
我尝试了以下方法:
for x in temp:
if x < 1200 or x > 1950:
temp.remove(x)
这给了我以下结果:
[1000, 1200, 1400, 1450, 1500, 1600, 1650, 1700, 1900, 1950, 2100]
但我的目标是以下输出:
[1200, 1400, 1450, 1500, 1600, 1650, 1700, 1900, 1950]
我找到了一种通过切片完成任务的方法:
new_temp = temp[temp.index(1200):temp.index(1950)+1]
这给了我想要的输出:
[1200, 1400, 1450, 1500, 1600, 1650, 1700, 1900, 1950]
但我想了解为什么attemp1不起作用,以及是否有比attemp2更好的方法来完成我的任务
任何人都可以帮忙吗?提前致谢。
解决方案
您的尝试 1不起作用,因为您修改了循环遍历的同一个列表。这可能会导致各种奇怪的行为,例如跳过某些值。这是一个例子:
>>> lst = [1, 2]
>>> for val in lst:
... lst.remove(val)
...
>>> lst
[2] # wat?
只是不要那样做:永远不要修改你循环的列表。
为了记录,这是最简单的正确方法(不一定是最快的):
result = [value for value in temp if 1200 <= value <= 1950]
另请注意,您的切片方法temp[temp.index(1200):temp.index(1950)+1]
仅在列表已排序的假设下有效。在这种假设下,我们可以比任何提出的方法都快得多。即我们可以进行二分搜索+切片。但是除非您处理数百万个值,否则复杂性可能不值得。
推荐阅读
- sql - 如何从 Advantage SQL DB 中的日期时间字段中提取日期
- sql - SQL选择多条记录,每次迭代都有限制
- linux - 为什么在使用 read() 命令之前无法清除缓冲区?(linux、evdev-input、读取、刷新)
- python - Dask 和 Numba - 如何有效地使用地图分区?
- flutter - Flutter 中是否有易于使用的股票音效,如果有,我该如何使用它们?
- go - Go 模块:校验和不匹配
- python - 有没有办法使用 python 的 argparse 而不明确列出 add_argument 传入的参数?
- machine-learning - 机器学习中的梯度下降算法
- typescript - 是否有使用值列表而不是类型定义变量类型的名称?
- bash - 如何不在 git 的 bash 脚本中存储 mariadb 凭据