Python 嵌套for循环的替代方法
我正在编写一个bash脚本,用于将几个位置与给定的开始位置/结束位置进行比较。 我有两个不同的文件(大小不同):Python 嵌套for循环的替代方法,python,bash,for-loop,Python,Bash,For Loop,我正在编写一个bash脚本,用于将几个位置与给定的开始位置/结束位置进行比较。 我有两个不同的文件(大小不同): 文件1:开始和结束位置(制表符分开) 文件2:单位置 Bash在处理循环时速度非常慢,我想到了使用python实现这种方法 python - << EOF posList=posString.split() endList=endString.split() startList=startString.split() for j, val2 in enumer
- 文件1:开始和结束位置(制表符分开)
- 文件2:单位置
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
python-=val2和endList[i]开始和位置
我的输入文件是字符串,空格用数字分隔
也许我完全走错了路,我希望不是,但是这个想法需要很长时间才能实现
非常感谢您的帮助。如果您先对位置和范围进行排序,可以节省大量时间:
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
range\u sorted\u list=sorted(zip(开始列表、结束列表))
范围排序的iter=iter(范围排序的列表)
已排序的位置列表=已排序(位置列表)
开始,结束=下一个(范围\u排序\u iter)
尝试:
对于pos_排序列表中的pos:
当pos>=结束时:
开始,结束=下一个(范围\u排序\u iter)
如果开始Itertools是一条路要走。乘积函数使用向量运算来提高执行效率
来自itertools导入产品的
posList=posString.split()
endList=endString.split()
startList=startString.split()
对于乘积(enumerate(posList),enumerate(startList))中的(j,val2),(i,val1):
如果val1>=val2和endList[i],我是否遗漏了一个具体的问题?你想知道什么?哦,对不起,我想知道你是否知道我如何加快这个过程?是否有替代我的嵌套for loopd的方法?posString
和endString
来自哪里?很难测试这一点,因为给定的代码不完整,必须首先导出示例值……我通过命令:endString=“$endJOIN”导入了一个bash数组。很抱歉,这是我第二次在论坛上写问题,所以忘了交重要信息。这些文件可能看起来像:endJOIN=“2 4 6 7 9”startJOIN=“1 3 4”posJOIN=“2 3 4 8”好的,所以每次位置在某个范围内时,您都希望输出true
,对吗?每次位置不在某个范围内时,您都希望打印false
。还有位置本身。这意味着您将始终打印n×m行,这是您想要的吗?非常感谢!它工作得真快!!好主意!
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,