在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]
这个zip
s 与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循环中,无法从列表中排除特定范围内的项目的主要内容,如果未能解决你的问题,请参考以下文章