python-无法在while循环中从列表中排除一定范围内的项目

所以我发布了一个问题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]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循环如何以及为什么阻止列表理解正确发生?

最佳答案

使用香草python,您可以使用任何/全部进行概括.我要和任何人一起去.

>>> [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压缩列表的每对备用列表项,并一一检查以确保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]