我有两个列表:一个是大约2百万个染色体位置的选定列表(例如[9866,9899,10257 ....])。另一个是染色体位置和p值的配对列表(例如[(9866,0.001),(9899,0.05)] ......)
我想检索所选2百万条染色体的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中的每一行和所选索引中的每个项目。我正在考虑使用set函数,但我的T3列表是配对元素列表
答案 0 :(得分:2)
可能更快的方法是从位置到pvalue进行映射:
mapping = dict(T3)
然后使用该映射:
selected_pvalues = [mapping[pos] for pos in positions]
注意:mapping
将删除任何重复的染色体位置,并将最后一个保留在原始列表中。
答案 1 :(得分:1)
我不确定第一个列表是否与第二个列表中的所有对的第一个元素具有完全相同的值(我假设它们不是,或者没有任何意义)。
您应该将对列表转换为字典,然后您将获得(通常)O(1)运行时复杂度中的每个值。
修改强>
虽然上面的内容应该很好,但是你的具体情况也可能导致内存问题,因为你正在处理数十亿条记录。在转换对的情况下列入字典会占用太多内存并降低整体性能,您可以使用另一种方法 -
将第一个(较小的)列表更改为一个集合。然后,回顾一下对#39;列表,并为每个元素检查它是否在该集合中。通过这种方式,您仍然可以在较大的结构上进行一次传递,但是您将需要更少的空间。
答案 2 :(得分:0)
最好为第二个列表的染色体存储另一个标识符。这将允许您构建字典而不是第二个列表。例如:
myTrillionsChromosomes = {
'chromosomeId': pValue,
...
}
编辑:也就是说,如果您可以实际控制这些列表的构造。另一个答案描述了如何将元组列表转换为字典,但考虑到该列表的大小,可能不是很明智。
然后,你只需要在字典中查找p值,这是在恒定时间内完成的。
selection = []
for id in identifiersList:
selection.append((id, myTrillionsChromosomes[id])