2013-04-15 11 views
22

Mi chiedo se c'è un modo più veloce e meno dispendioso di iterare su un elenco di tuple, trovando la corrispondenza giusta. Quello che faccio è:iterazione rapida attraverso l'elenco delle tuple

# 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 

questo codice può richiedere molto tempo per l'esecuzione, a seconda del numero di elementi nella lista. Sono sicuro che c'è un modo migliore per farlo.

risposta

14

Supponendo che l'utilizzo della memoria un po 'di più non è un problema e se il primo elemento della tupla è lavabile, è possibile creare un dict dall'elenco di tuple e quindi cercare il valore è semplice come cercare una chiave dallo dict. Qualcosa di simile:

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

EDIT: Per creare una mappatura inversa, usare qualcosa come:

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

che sembra grande ma sarà permettimi solo di cercare per "vecchio valore". devo creare due dicts per poter cercare nei campi dei valori vecchi e nuovi? – memyself

+0

@memyself: Sì, hai ragione. Se devi cercare * sia * vecchi che nuovi valori, dovrai creare due dicts. Ma immagino che non sia poi così male se tutto ciò che vuoi è una rapida occhiata. Ho aggiunto lo snippet di esempio per la creazione di reverse dict. –

+0

Non sapevo di get(), questo mi ha reso la vita molto più semplice. – dgBP

25

penso che è possibile utilizzare

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

ma che non farà il ciclo eseguire più velocemente. sara? – memyself

+0

Dovresti dare un'occhiata a questa altra domanda: http://stackoverflow.com/questions/2191699/find-an-element-in-a-list-of-tuples – Eric

+0

trovato facile da capire, tks –

2

Il codice può essere ripulito, ma se si utilizza un elenco per memorizzare le tuple, tale ricerca sarà O (N).

Se la velocità di ricerca è importante, è necessario utilizzare uno dict per memorizzare le tuple. La chiave dovrebbe essere l'elemento 0 delle tue tuple, poiché è quello su cui stai cercando. È possibile creare facilmente un dict dall'elenco:

my_dict = dict(my_list) 

Poi, (VALUE, my_dict[VALUE]) vi darà la vostra tuple corrispondente (supponendo VALUE esiste).

0

Mi chiedo se il metodo seguito è quello che vuoi.

È possibile utilizzare 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])] 
1

La domanda è morto, ma ancora conoscere un altro modo non fa male:

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 
Problemi correlati