Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在Python中高效地查找区间索引_Python 3.x_List Comprehension - Fatal编程技术网

Python 3.x 如何在Python中高效地查找区间索引

Python 3.x 如何在Python中高效地查找区间索引,python-3.x,list-comprehension,Python 3.x,List Comprehension,我有一个网格,网格中有一个值列表。如何有效地为包含它们的网格间隔对应的值计算索引列表。下面是一个示例代码: xgrid = [304.0, 317.3, 330.7, 344.1, 357.4, 370.8] xlist = [310, 320, 360] output = [] for x in xlist: for xi in xgrid: if (xi < x): xindex = xi output.append(xinde

我有一个网格,网格中有一个值列表。如何有效地为包含它们的网格间隔对应的值计算索引列表。下面是一个示例代码:

xgrid = [304.0, 317.3, 330.7, 344.1, 357.4, 370.8]
xlist = [310, 320, 360]

output = []
for x in xlist:
    for xi in xgrid:
        if (xi < x):
            xindex = xi
    output.append(xindex)

print(output)
xgrid=[304.0317.3330.7344.1357.4370.8]
xlist=[310320360]
输出=[]
对于xlist中的x:
席格网:
如果(xi
本例的预期输出为[304.0317.3357.4]


xgrid的大小大约为50,但xlist可能更大,包含100-200个值。

Python标准库提供了
对分
,可用于进行搜索 给你:

关于速度,我尝试了以下方法(附加到上面的代码中):

这将表明对分算法的速度稍微快一些
较小的列表,并且可能随着较大的列表而逐渐变好。

您可以尝试此方法,这样会节省时间

xgrid = [304.0, 317.3, 330.7, 344.1, 357.4, 370.8]
xlist = [310, 320, 335]

print([xgrid[i] for i in range(len(xlist)) if xgrid[i] < xlist[i]])
xgrid=[304.0317.3330.7344.1357.4370.8]
xlist=[310320335]
如果xgrid[i]

取较小的列表长度,您可以根据您的问题构造if条件。

我建议使用二进制搜索算法。在wiki或google上很容易找到;)如果您不反对numpy,并且您的xgrid总是被排序的,那么您可以使用我不太明白您想要做什么,但是在代码中,将行
xindex=xi
替换为
output.append(xi)
,这将完成我理解的您正在尝试的操作。或者正如@JacobFaib所提到的,您可以始终使用
numpy
它更快。此解决方案依赖于i,这是上面更新的示例代码的一个问题。
import timeit

s = '''\
output = []
for x in xlist:
    for xi in xgrid:
        if (xi < x):
            xindex = xi
    output.append(xindex)
'''
s2 = '''\
output = [find_lt(xgrid, x) for x in xlist]
'''
print(timeit.timeit(s, number=100_000, globals=globals()))
print(timeit.timeit(s2, number=100_000, globals=globals()))

xgrid = [203.1, 207.2, 304.0, 317.3, 330.7,
         344.1, 357.4, 370.8, 400.1, 401.0]
xlist = [310, 320, 335, 399, 402]
print(timeit.timeit(s, number=100_000, globals=globals()))
print(timeit.timeit(s2, number=100_000, globals=globals()))
0.11740579998877365
0.1047545000037644
0.28514970000833273
0.18074260000139475
xgrid = [304.0, 317.3, 330.7, 344.1, 357.4, 370.8]
xlist = [310, 320, 335]

print([xgrid[i] for i in range(len(xlist)) if xgrid[i] < xlist[i]])