我正在研究一个bash脚本,用于比较给定起始位置/结束位置的多个位置。 我有两个不同的文件(大小不同):
Bash在处理循环时非常慢,我想到了使用python这种方法。
python - << EOF
posList=posString.split()
endList=endString.split()
startList=startString.split()
for j, val2 in enumerate(posList):
for i, val1 in enumerate(startList):
if val1 >= val2 and endList[i] <= val2:
print "true", val2
else:
print "false", val2
EOF
我有三个字符串作为输入(位置,开始,结束)并将它们拆分为列表。 使用两个嵌套循环,我遍历更大的位置文件,然后遍历星形/结束文件。如果我的条件已满(如果pos&gt; start和position&lt; end )我想打印一些东西。
我的输入文件是字符串,空格用数字分隔。
也许我绝对是错误的,我希望不是,但有了这个想法,用它来做太长时间。
非常感谢你的帮助。
答案 0 :(得分:0)
如果您从排序位置和范围开始,可以节省大量时间:
range_sorted_list = sorted(zip(start_list, end_list))
range_sorted_iter = iter(range_sorted_list)
pos_sorted_list = sorted(pos_list)
start, end = next(range_sorted_iter)
try:
for pos in pos_sorted_list:
while pos >= end:
start, end = next(range_sorted_iter)
if start <= pos < end:
print "True", pos
elif pos < start:
print "False", pos
except StopIteration:
pass
这将允许您只遍历数组一次,而不是每个位置一次。
答案 1 :(得分:0)
Itertools是要走的路。产品功能使用向量操作来提高执行效率。 itertools
from itertools import product
posList=posString.split()
endList=endString.split()
startList=startString.split()
for (j, val2),(i,val1) in product(enumerate(posList),enumerate(startList)):
if val1 >= val2 and endList[i] <= val2:
print "true", val2
else:
print "false", val2,