Python将int的间隔索引为int列表的最快方法

时间:2014-05-22 15:45:55

标签: python list loops intervals

所以我在从文本文件收集的列表中有一个int的间隔...

start = x  """where 43189 < x < y < 4600941"""
end = y
list = [x,...,y]

我正在循环浏览另一个文件中的许多整数列......

for line in open(file):
    column = line.split()
    print column[1]

输出:

43189
43190
...
4600941

如果数字是有序的,但间隙数量未知

从列[1]收集的整数中索引列表开头的最快方法是什么?

区间介于43189和4600941之间。 迭代地将列中的每个int与区间中的起始值进行比较是非常耗时且浪费的,如果列中的起始值不均匀(存在许多间隙)

编辑:

我在许多时间间隔内这样做,不仅仅是一个,因此x和y是任意的,但它是已知的43189&lt; x&lt; y&lt; 4600941,我的问题是x或y,或者介于两者之间的任何int可能不在我正在比较它们的数字集中,所以如果它是最简单的方法将迭代在间隔上附加到下一个int在整数列中找不到?

1 个答案:

答案 0 :(得分:1)

我不能100%确定这是否是您所要求的,但我对您的问题的理解是,如果您列出l列表,请执行以下操作:

with open(file) as f:
    l = [line.split()[1] for line in f]  # line.split()[1] == column[1] from your example

您想知道l所在的x内的索引。如果确实如此,您可以使用bisect模块来帮助解决此问题,因为它似乎可以排序l

import bisect

def index(a, x):
    'Locate the leftmost value exactly equal to x'
    i = bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError

然后,您可以致电i = index(l, x)查找x l内的x索引。如果l不在ValueError中,则会引发file。让我知道如果我误解了,我们可以尝试调整它以满足您的需求。

修改

同样,因为您不太清楚自己要做什么,所以只需将with open(file) as f: d = dict((line.split()[1], 1) for line in f) 中的所有内容读入dict即可满足您的需求:

file

这会给你一个字典,其中键是if x in d: # Do stuff 中的所有内容。然后你可以说

x

快速(平均为O(1))确定file中是否存在{{1}}。