我最关心的是效率。我有一个很长的ID列表,我有一个较短的ID列表。我想在第二个列表中存储ID的位置,这些位置对应于第一个列表中的每个ID(每个ID应该只在每个列表中出现一次)。我已经编写了一个嵌套的for循环来执行此操作,但由于第一个列表包含超过1000个元素,而第二个列表包含超过80k的元素,因此下面的代码需要很长时间(但有效)。
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是相同但更长的。
答案 0 :(得分: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)。