在while循环中,无法从列表中排除特定范围内的项目

Posted

技术标签:

【中文标题】在while循环中,无法从列表中排除特定范围内的项目【英文标题】:Unable to exclude items from a list, in a while loop, that are in a certain range 【发布时间】:2018-06-23 18:10:08 【问题描述】:

所以我发布了一个问题before,但它过于简化,被正确地标记为重复。我现在更详细地发布我的问题,希望我的问题可以得到解决。简而言之如下: 我有两个列表:a = [10.0,20.0,25.0,40.0] 和 b = [1.0,10.0,15.0,20.0,30.0,100.0]

使用列表推导,我想从 b 中排除 a 中指定的元素范围。即:从 b 中删除 10.0 到 20.0 之间以及 25.0 到 40.0 之间的所有元素。这是我尝试过的:

kk = 0
while kk < len(a):
    up_lim = a[kk] #upper limit
    dwn_lim = a[kk+1] #lower limit
    x = [b[y] for y in range(len(b)) if (b[y]<dwn_lim or b[y]>up_lim)] #This line produces correct result if done outside of a while loop. Somehow fails in while loop.
    b = list(x) #update the old list with the new&reduced list
    kk += 2 #update counter

我期待结果x = [1.0,100.0],但我得到x = [1.0,10.0,15.0,20.0,30.0,100.0]

事实上,如果我在 while 循环之外执行列表理解的关键行(当然这是没用的,因为列表 'a' 的大小可以是任意的,这就是我使用 while 循环的原因)。

所以问题是:while 循环如何以及为什么会阻止列表推导正确发生?

【问题讨论】:

真的,你应该看看 numpy 或 pandas。 我确实在我的代码示例中发现了一个缺陷。 up_lim 和 dwn_lim 应该交换,这应该工作。不过,我已经接受了下面的答案。谢谢,小伙子们。 【参考方案1】:

使用 vanilla python,您可以使用any/all 进行泛化。我要在这里any

>>> [x for x in b if not any(i <= x <= j for i, j in zip(a[::2], a[1::2]))]
[1.0, 100.0]

这个zips 与zip 的每个备用列表项对,并一一检查以确保x 不在其中任何一个。

如果您对表演感兴趣,可以考虑使用 pandas 方法。您可以建立一个Intervalindex,适合该任务。搜索是对数的,而且非常快。

>>> import pandas as pd
>>> idx = pd.IntervalIndex.from_arrays(a[::2], a[1::2], closed='both')
>>> [x for x, y in zip(b, idx.get_indexer(b)) if y == -1]
[1.0, 100.0]

【讨论】:

谢谢,这行得通。我还在我的代码中发现了一个缺陷:如果我交换 up_lim 和 dwn_lim,那么它应该一切正常。但我从你的回答中学到了一些新东西。 @Edwin Cheers,感谢您接受您的另一个问题的结束,以及全方位的体育精神。请继续为 SO 贡献你的问题(也许有一天,你的答案也是如此)。

以上是关于在while循环中,无法从列表中排除特定范围内的项目的主要内容,如果未能解决你的问题,请参考以下文章

while循环内的变量范围

while 循环语句

使用Excel中的特定排除项计算前3个分数

gitlab yaml管道内的while循环

循环枚举条件判断冒泡排序

如何使用php中的while循环显示从数据库中获取的多个图像中的特定点击图像,以及用于显示的javascript?