53 votes

itérer rapidement dans une liste de tuples

Je me demande s'il existe un moyen plus rapide et moins fastidieux d'itérer sur une liste de tuples pour trouver la bonne correspondance. Voici ce que je fais :

# this is a very long list.
my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]

# go through entire list and look for match
for j in my_list:
    if j[0] == VALUE:
        PAIR_FOUND = True
        MATCHING_VALUE = j[1]
        break

l'exécution de ce code peut prendre un certain temps, en fonction du nombre d'éléments de la liste. Je suis sûr qu'il existe une meilleure façon de procéder.

74voto

Eric Points 8793

Je pense que vous pouvez utiliser

for j,k in my_list:
  [ ... stuff ... ]

28voto

Sanjay T. Sharma Points 12620

Si l'utilisation d'un peu plus de mémoire n'est pas un problème et si le premier élément de votre tuple est hachable, vous pouvez créer un fichier dictée à partir de votre liste de tuples et de rechercher la valeur est aussi simple que de rechercher une clé dans la base de données dict . Quelque chose comme :

dct = dict(tuples)
val = dct.get(key) # None if item not found else the corresponding value

EDITAR : Pour créer une correspondance inversée, utilisez quelque chose comme :

revDct = dict((val, key) for (key, val) in tuples)

4voto

Vaibhav Singh Points 69

La question n'est plus d'actualité, mais savoir qu'il existe un moyen supplémentaire ne fait pas de mal :

my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]

for first,*args in my_list:
    if first == Value:
        PAIR_FOUND = True
        MATCHING_VALUE = args
        break

2voto

tom Points 5216

Le code peut être nettoyé, mais si vous utilisez une liste pour stocker vos tuples, toute recherche de ce type sera O(N).

Si la vitesse de consultation est importante, il est préférable d'utiliser un dict pour stocker vos tuples. La clé doit être le 0e élément de vos tuples, puisque c'est ce sur quoi vous effectuez votre recherche. Vous pouvez facilement créer un dict à partir de votre liste :

my_dict = dict(my_list)

Ensuite, (VALUE, my_dict[VALUE]) vous donnera le tuple correspondant (en supposant que VALUE existe).

1voto

Peter Tsung Points 382

Je me demande si la méthode ci-dessous correspond à ce que vous souhaitez.

Vous pouvez utiliser defaultdict .

>>> from collections import defaultdict
>>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)]
>>> d = defaultdict(list)
>>> for k, v in s:
       d[k].append(v)    
>>> sorted(d.items())
[('blue', [2, 4, 4]), ('red', [1, 3, 1])]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X