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.
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
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
pourriez-vous jeter quelques exemples de données avec peut-être 20 éléments et la sortie que vous voulez sortir? –