我试图从一组多个区间中提取第n个元素。我目前正在处理基因组序列。假设我们有一个中间有缺口的基因。该基因在整个DNA中的位置是:
gene = [100,110], [130,140]
# representing the lists [100,101,...,109] and [130, 131,...,139]
# the gene spans over these entries of the DNA, so it looks like -gene-gap-gene-
现在,对于基因内的位置(例如第10位),我想找到整个DNA上的相应位置(在本例中为109)。 该功能应该执行以下操作:
function(gene, 9)
> 109
function(gene, 10)
> 130
我的方法是显式生成两个序列,连接它们并获取此列表的第n个元素。但是,对于大型列表(因为它们碰巧发生),这是非常低效的。
有人能想到一个简单的方法吗?
提前致谢!
答案 0 :(得分:1)
通用解决方案应该可以根据需要在基因中发挥尽可能多的空白:
gene = [[100,110], [130,140]]
def function(gene, n):
for span in gene:
span_len = span[1] - span[0]
if n <= span_len:
return n + span[0] - 1
else:
n -= span_len
print(function(gene,10))
print(function(gene,11))
答案 1 :(得分:0)
您的function
可以同时提供两个列表,您可以找到应该编制索引的列表以及使用列表大小的位置
所以如果您执行function(gene, 10)
和function(gene, 11)
10 <= len(List1)
但是11 > len(list1)
因此您知道在11
的情况下您需要访问第二个列表,而正确的元素是11 - len(list1) -1
,它是索引0但是第二个清单。