2017-03-22 81 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)。