2013-05-23 19 views
6

Esiste un modo migliore per confrontare la lunghezza di tre elenchi per assicurarsi che abbiano tutte le stesse dimensioni oltre a fare confronti tra ogni serie di variabili? Cosa succede se volevo controllare la lunghezza è uguale su dieci liste. Come potrei fare per farlo?Confronta la lunghezza di tre elenchi in python

+1

Non è necessario confrontare ogni possibile coppia di liste (che è 'O (n!)' Del numero di liste). Hai solo bisogno di confrontare il primo elenco con tutti gli altri elenchi (che è 'O (n)'). –

+1

L'uguaglianza è transitiva, quindi una volta stabilito che due di essi sono uguali, sceglierne uno e confronta ciascuno degli elenchi rimanenti con quello. – chepner

+0

Non ho molta familiarità con Python, quindi non so davvero come usare i generatori o qualcuna di quelle cose fantasiose per fare qualcosa del genere. – MasterGberry

risposta

14

Utilizzando all():

length = len(list1) 
if all(len(lst) == length for lst in [list2, list3, list4, list5, list6]): 
    # all lists are the same length 

o per scoprire se una qualsiasi delle liste hanno una lunghezza diversa:

length = len(list1) 
if any(len(lst) != length for lst in [list2, list3, list4, list5, list6]): 
    # at least one list has a different length 

noti che all() e any() volontà di corto circuito, così per esempio se list2 ha una lunghezza diversa, non eseguirà il confronto per list3 tramite list6.

Se le liste sono memorizzate in una lista o una tupla invece di variabili distinte:

length = len(lists[0]) 
if all(len(lst) == length for lst in lists[1:]): 
    # all lists are the same length 
+0

quindi se volessi trovare una lista che non fosse uguale alla lunghezza per gli altri, dovrei semplicemente cambiare 'len (lst) == length' a 'len (lst)! = length'? – MasterGberry

+0

Si potrebbe usare 'if not all (len (lst) == length ...)' o 'if any (len (lst)! = Length ...)' per scoprire se una lista ha una lunghezza diversa. O hai effettivamente bisogno di sapere quali liste hanno lunghezze diverse? –

+0

No, basta verificare che siano tutti uguali. Non mi piace usare 'if/else' se posso usare' if' – MasterGberry

3

Assumendo le vostre liste sono memorizzate in un elenco (chiamato my_lists), usare qualcosa di simile:

print len(set(map(len, my_lists))) <= 1 

Questo calcola le lunghezze di tutti gli elenchi presenti in my_lists e inserisce queste lunghezze in un set. Se sono tutti uguali, il set conterrà un elemento (o zero non hai liste).

+1

perché <1 ... forse intendevi == 1 – wim

+0

Perché se "mie_elenco" è vuoto, cioè stai verificando se le lunghezze delle liste zero sono uguali, allora la risposta è sì. – mbatchkarov

+1

Quindi funziona solo per una lista vuota. –

1

uno di linea utilizzando itertools.combinations()

import itertools 

l1 = [3,4,5] 
l2 = [4,5,7] 
l3 = [5,6,7,8,3] 

L = [l1, l2, l3] 

verdict = all([len(a)==len(b) for a,b in list(itertools.combinations(L,2))]) 

Primo elenco build di lista, L. Quindi interrogare tutti i set di due elementi di L, con list(itertools.combinations(L,2)):

>>> list(itertools.combinations(L,2)) 
[([3, 4, 5], [4, 5, 7]), ([3, 4, 5], [5, 6, 7, 8, 3]), 
      ([4, 5, 7], [5, 6, 7, 8, 3])] 

quindi lunghezze di prova per ciascuna coppia in questa lista. Infine, prendi l'intersezione dei booleani, con all().

>>> verdict 
False 

Quale è corretto. Proviamo con le liste di prova della stessa dimensione.

l1 = [3,4,5] 
l2 = [4,5,7] 
l3 = [5,6,7] 

L = [l1, l2, l3] 

verdict=all([len(a)==len(b) for a,b in list(itertools.combinations(L,2))]) 

otteniamo

>>> verdict 
True 
Problemi correlati