2016-11-23 177 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

相關問題