2017-03-22 80 views
0

我最關心的是效率。我有一個非常長的ID列表,並且我有第二個更短的ID列表。我想在第二個列表中存儲與第一個列表中每個ID相對應的ID的位置(每個ID只應在每個列表中出現一次)。我寫了一個嵌套for循環來做到這一點,但由於第一個列表包含超過1000個元素,第二個列表包含超過80k個元素,所以下面的代碼需要很長的時間(但工作)。如何向python中的向量化嵌套for循環

IDD1 = [0] * leng 
IDD2 = [0] * leng 
## Match IDs to position in table 
for i in range(leng): 
    for j in range(len(halo_id)): 
     if ID1[i] == halo_id[j]: 
      IDD1[i] = j 
     if ID2[i] == halo_id[j]: 
      IDD2[i] = j 

如果它有任何相關性,則ID最初來自halotools光暈目錄表。

編輯:

在兩種情況下,數據實際上只是一個整數列表。我想要的結果是一個整數列表(索引)。 ID1和ID2本質上是同樣的東西,我只需要以相同的方式對它們進行操作。它們是我早期的整數列表。 halo_id是相同的,但更長。

+1

你應該使用NumPy嗎?向量化的提法聽起來像你應該使用NumPy,但你並沒有提到NumPy或任何NumPy數據結構。 – user2357112

+0

'ID1'(和'ID2')只是一個'0'列表,'ID1 [i]'等於'halo_id [j]'。但它聽起來像你只需要把'halo_id'轉換成反向字典。 – AChampion

+0

你可以拋出一些示例數據,可能有20個元素和你想要的輸出嗎? –

回答

2

首先,創建ID的到位置的映射:

idmap = {i: e for (e, i) in enumerate(halod_id)} 

然後遍歷較小目錄,並把它通過映射:

idd1 = [idmap[el] for el in id1] 

這減少選自O操作(N * m)到O(n + m)。