考虑以下功能:
def search( seq, start, end ):
state = 0
ret = []
aux = []
for i in seq:
if state == 0:
if i == start:
aux = [i]
state = 1
elif state == 1:
aux.append(i);
if i == end:
ret.append(aux)
state = 0
return ret
search()
函数是一个非常基本的双状态机,它使用start
和end
作为分隔符返回子列表。例如:
DNA = ['CGC','UUC','GCU','UUG','GAA','AAU','UUG','UGU','GUU','UUU','UGU',
'GGC','UGC','UCG','CUG','CUC','AAA','UUG','UUC','GCU','GCU','UUU',
'UGU','GUC','CUG','GCU','GCU','UUU','AUU','AUU','AAU','CGC','UGC',
'UUG','GCG','GUU','CUG','UUA','CGC','UGC','UUG','GGC','UUG','UUG',
'UGG','CUU','UGG','UUG','UUU','GUA','UAU','UGA','GCU','GUU','CUU',
'UGG','CUU','UGG','AAU','UUU','GUU','UAU','UAG','GCU','GCU','CUU',
'GUU','GUU','GUU','GCU','UGU','UGU','AAU','GUU','GGC']
print( search( DNA, start='AAU', end='GUU') )
输出:
[['AAU', 'UUG', 'UGU', 'GUU'], ['AAU', 'CGC', 'UGC', 'UUG', 'GCG', 'GUU'], ['AAU', 'UUU', 'GUU'], ['AAU', 'GUU']]
有没有可能用list comprehension
写一个等价的函数?你知道吗
我不确定理解是完成这项任务的正确工具。不过,您可以编写一个非常pythonic的generator:
如果你真的想要理解,你可以使用一些
takewhile
和dropwhile
的调戏:这是丑陋的,但我相信它有一些问题:)一个发生的
start
后,最后end
例如。。。你知道吗我想你想要的是列表的子集,给定列表中的起始值和结束值。 首先,您可以通过以下方式减少搜索空间:
然后,您可以在空间中迭代搜索更多的开始和结束。由于没有重叠序列,您可以尝试:
或者(尽管在任何zense中都是完全“非音速的”),您可以使用
numpy.searchsorted
给定开始和结束的索引:numpy
回答来自Given 2 list of integers how to find the non-overlapping ranges?相关问题 更多 >
编程相关推荐