所以我在从文本文件收集的列表中有一个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在整数列中找不到?
答案 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}}。