2016-11-23 145 views
2

我有两个列表:一个是大约200万染色体位置的选定列表(例如[9866,9899,10257 ....])。另一个是与染色体位置和pvalue成对列表(例如[(9866,0.001),(9899,0.05)] ...)使用另一个列表(Python)在配对元素列表中查找元素

我想检索选定的200万染色体的p值。我的代码目前如下:

Selection = [] 
    for i in selected indices: 
     for x in list(range(len(T3))): 
     if T3[x][0] == i: 
      b = T3[x][0],T3[x][1] 
      Selection.append(b) 

有没有最快的方法来做到这一点?显然,这是非常缓慢的,因为它在T3中的每一行以及所选索引中的每个项目进行迭代。我想用一组函数,但我的T3名单是对元件

+1

为什么如果你在第二个职位上有职位,你使用你的第一个清单?我不知道你想做什么。请显示您的预期输出 – MMF

+1

我有第二个名单中的位置,但是大约有14亿个职位,我只想从另一个名单中选择2百万个 – CenCG

+0

现在更清楚了...... – MMF

回答

2

可能的名单,更快的方法将是使从位置映射到p值:

mapping = dict(T3) 

然后使用该映射:

selected_pvalues = [mapping[pos] for pos in positions] 

注:mapping将删除任何重复的染色体位置,只保留在原来的列表中的最后一个。

+0

T3是14亿条目,如果“选择”操作只需要进行一次,那么应该有比这更快的方法 – Adirio

+0

@ juanpa.arrivillaga谢谢你的工作很棒!一旦我拥有足够的声望,就会记得投票 – CenCG

+0

@Adirio不知道为什么,但实际上这是快得很快的 – CenCG

1

我不确定第一个列表是否与第二个列表中的所有对的第一个元素具有完全相同的值(我假设他们不是,或者他们没有任何意义)。

您应该将对列表转换为字典,然后您将获得(通常)O(1)运行时复杂度中的每个值。

编辑

虽然上面的应该工作相当精细,您的具体情况也可能导致内存问题,因为你正在处理数十亿条记录。在将对列表转换为字典需要太多内存并降低整体性能的情况下,可以使用另一种方法 -

将第一个(较小)列表更改为一个集合。然后,检查对的列表,并检查每个元素是否在该集合中。这样,您仍然可以在较大的结构上通过一次,但您将需要更少的空间。

+0

把它变成一个集合可能是不需要的,因为他可能想要在列表中有重复的条目,并且因为它将使用成对列表顺序而不是所选项目顺序,并且它们可能不同 – Adirio

+0

在你建议的情况下我不确定这是OP所要求的),我们可以通过使用 - 而不是一组 - 一个字典来解决这个问题,该字典的关键是位置和值是原始列表中的索引(的列表)。这仍然可以确保所需的内存按大小顺序变小。 – Mike

0

最好为第二个列表的染色体存储另一个标识符。这将允许你建立一个字典而不是第二个列表。例如:

myTrillionsChromosomes = { 
    'chromosomeId': pValue, 
    ... 
} 

编辑:也就是说,如果你可以实际控制这些名单的建设。另一个答案描述了如何将元组列表转换为一个字典,但是鉴于该列表的大小,它可能不是很明智。

然后,你只需要查看字典中的p值,这是在不变的时间完成的。

selection = [] 
for id in identifiersList: 
    selection.append((id, myTrillionsChromosomes[id]) 
+1

删除评论,因为他们现在没有提供任何信息,你应该这样做。 Downvote也被删除。 – Adirio