2017-03-22 2 views
0

Je suis surtout préoccupé par l'efficacité. J'ai une très longue liste d'identifiants, et j'ai une deuxième liste d'identifiants plus courte. Je veux stocker les positions des ID dans la deuxième liste qui correspondent à chaque ID de la première liste (chaque ID ne doit apparaître qu'une seule fois dans chaque liste). J'ai écrit une boucle for imbriquée pour faire cela, mais comme la première liste contient plus de 1000 éléments et la deuxième liste contient plus de 80k éléments, le code ci-dessous prend très longtemps (mais fonctionne).Comment vectoriser une boucle imbriquée en python

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 

Si cela est pertinent, les ID proviennent à l'origine d'une table de catalogue halo halotools.

Edit:

Les données sont littéralement juste une liste d'entiers dans les deux cas. Le résultat que je veux est une liste d'entiers (indices). ID1 et ID2 sont essentiellement la même chose que j'ai juste besoin de fonctionner sur les deux de la même manière. Ils sont une liste d'entiers que j'ai plus tôt. halo_id est le même mais beaucoup plus long.

+1

Etes-vous censé utiliser NumPy? La mention de la vectorisation ressemble à l'utilisation de NumPy, mais vous n'avez pas mentionné NumPy ni aucune structure de données NumPy. – user2357112

+0

Comment 'ID1 [i]' toujours égal 'halo_id [j]' donné 'ID1' (et' ID2') est juste une liste de '0'. Mais il semble que vous ayez juste besoin d'activer 'halo_id' dans un dictionnaire inverse. – AChampion

+0

pourriez-vous jeter quelques exemples de données avec peut-être 20 éléments et la sortie que vous voulez sortir? –

Répondre

2

Tout d'abord, créer un mappage d'identité à la position:

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

ensuite itérer sur la liste plus petit et le mettre dans la mise en correspondance:

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

Cela réduit l'opération de O (n * m) à O (n + m).