如何从列表中移除不在指定范围内的元素?

3 投票
3 回答
79 浏览
提问于 2025-04-14 18:16

我正在做一个学校的项目,需要从一个列表(数据)中去掉那些不在用户给定的上下限范围内的元素。我们需要用一个循环,并在里面加一个if语句。

这是我目前的代码:

lower = int(input("Lower bound: "))
upper = int(input("Upper bound: "))
    
j = 0
while j < len(data):
    if data[j] < lower or data[j] > upper:
        data.pop(j)
    j += 1
for i in range(len(data)):
    print(data[i], end = " ")
print()

我之前觉得代码写得不错,但后来发现还有一些数字不在设定的范围内。

在我输入上下限之前,数据里包含了这些数字: 1 10 10 11 14 20 20 24 25 25 32 33 34 36 41 42 44 45 45 48

然后在我输入下限11和上限41后,数据变成了: 10 11 14 20 20 24 25 25 32 33 34 36 41 44 45

所有应该包含的数字(11到41之间的)都在里面,但也多出了3个不在范围内的数字。

如果我的帖子格式不对,我很抱歉,这是我第一次使用Stack Overflow。提前谢谢大家!

3 个回答

0

正如第一个评论所说的,问题出在你在遍历列表时同时从中删除元素。具体来说,当你在第一次循环中从索引 0 删除了 1,那么原本在索引 110 就会移动到索引 0。接下来,在你的下一次循环中,你继续使用 j = 1,这样的话,原本在索引 010 就没有被检查到。这种情况下,最保险的做法是把需要的元素添加到一个新的列表中:

lower = int(input("Lower bound: "))
upper = int(input("Upper bound: "))
    
data = [1, 10, 10, 11, 14, 20, 20, 24, 25, 25, 32, 33, 34, 36, 41, 42, 44, 45, 45, 48]
data_in_range = []

j = 0
while j < len(data):
    if data[j] >= lower and data[j] <= upper:
        data_in_range.append(data[j])
    j += 1
for i in range(len(data_in_range)):
    print(data_in_range[i], end = " ")
print()
2

在你遍历一个列表的时候,千万不要去修改它。

使用列表推导式是个很好的选择。

lower = 11
upper = 41

data = [1, 10, 10, 11, 14, 20, 20, 24, 25, 25, 32, 33, 34, 36, 41, 42, 44, 45, 45, 48]
data = [x for x in data if lower <= x <= upper]

print(data)

输出结果:

[11, 14, 20, 20, 24, 25, 25, 32, 33, 34, 36, 41]
2

之前已经有人回答过这个问题,问题在于当你从列表中删除一个元素时,后面的元素会向左移动,这样你就会跳过下一个元素。

你可以简单地修改你的代码,只有在当前这次操作没有删除任何元素时,才增加你的索引“j”。

lower = int(input("Lower bound: "))
upper = int(input("Upper bound: "))

j = 0
while j < len(data):
    if data[j] < lower or data[j] > upper:
        data.pop(j)
    else:
        j += 1
for i in range(len(data)):
    print(data[i], end = " ")
print()

撰写回答