簡體   English   中英

嵌套循環的替代方法

[英]Alternative to nested 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

我有三個字符串作為輸入 (position,start,end),並將它們分成list 通過兩個嵌套循環,我遍歷了較大的位置文件,然后遍歷了星形/末端文件。 如果我的條件已滿( 如果pos> start和position <end ),我想打印一些內容。

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

也許我絕對會走錯路,但我希望不會,但是有了這個主意,花太長時間了。

非常感謝你的幫助。

如果從排序位置和范圍開始,可以節省很多時間:

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

這將使您只能遍歷數組一次,而不是每個位置都遍歷一次。

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,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM