[英]Alternative to nested for loop
我正在研究一個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
我有三個字符串作為輸入 (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.