如何从列表中移除不在指定范围内的元素?
我正在做一个学校的项目,需要从一个列表(数据)中去掉那些不在用户给定的上下限范围内的元素。我们需要用一个循环,并在里面加一个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
,那么原本在索引 1
的 10
就会移动到索引 0
。接下来,在你的下一次循环中,你继续使用 j = 1
,这样的话,原本在索引 0
的 10
就没有被检查到。这种情况下,最保险的做法是把需要的元素添加到一个新的列表中:
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()