替代嵌套for循环

时间:2014-05-09 10:41:26

标签: python bash for-loop

我正在研究一个bash脚本,用于比较给定起始位置/结束位置的多个位置。 我有两个不同的文件(大小不同):

  • 文件1:开始和结束位置(标签分隔)
  • 文件2:单一位置

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 )我想打印一些东西。

我的输入文件是字符串,空格用数字分隔。

也许我绝对是错误的,我希望不是,但有了这个想法,用它来做太长时间。

非常感谢你的帮助。

2 个答案:

答案 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,