首页 > 解决方案 > 从列表中删除值

问题描述

我有以下问题:

我有一个清单:

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更好的方法来完成我的任务

任何人都可以帮忙吗?提前致谢。

标签: pythonpython-3.xlist

解决方案


您的尝试 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]仅在列表已排序的假设下有效。在这种假设下,我们可以比任何提出的方法都快得多。即我们可以进行二分搜索+切片。但是除非您处理数百万个值,否则复杂性可能不值得。


推荐阅读