Python Language Elenco delle conclusioni con cicli annidati


Esempio

Le comprensioni della lista possono usare annidati for cicli. È possibile codificare qualsiasi numero di cicli for innestati all'interno di una lista di comprensione, e ciascuno for ciclo può avere un optional associato if prova. Nel fare ciò, l'ordine del for costrutti è lo stesso ordine come quando si scrive una serie di nidificato for dichiarazioni. La struttura generale delle list comprehensions si presenta così:

[ expression for target1 in iterable1 [if condition1]
             for target2 in iterable2 [if condition2]...
             for targetN in iterableN [if conditionN] ]

Ad esempio, il seguente codice che appiattisce un elenco di elenchi utilizzando più istruzioni for :

data = [[1, 2], [3, 4], [5, 6]]
output = []
for each_list in data:
    for element in each_list:
        output.append(element)
print(output)
# Out: [1, 2, 3, 4, 5, 6]

può essere scritto in modo equivalente come una lista di comprensione con multipli for costrutti:

data = [[1, 2], [3, 4], [5, 6]]
output = [element for each_list in data for element in each_list]
print(output)
# Out: [1, 2, 3, 4, 5, 6]

Dimostrazione dal vivo

Sia nella forma espansa che nella comprensione della lista, il ciclo esterno (prima per la dichiarazione) viene prima di tutto.


Oltre ad essere più compatto, la comprensione annidata è anche significativamente più veloce.

In [1]: data = [[1,2],[3,4],[5,6]]
In [2]: def f():
   ...:     output=[]
   ...:     for each_list in data:
   ...:         for element in each_list:
   ...:             output.append(element)
   ...:     return output
In [3]: timeit f()
1000000 loops, best of 3: 1.37 µs per loop
In [4]: timeit [inner for outer in data for inner in outer]
1000000 loops, best of 3: 632 ns per loop

Il sovraccarico per la chiamata di funzione sopra è di circa 140ns .


In linea if s sono nidificati in modo simile e possono verificarsi in qualsiasi posizione dopo il primo for :

data = [[1], [2, 3], [4, 5]]
output = [element for each_list in data
                if len(each_list) == 2
                for element in each_list
                if element != 5]
print(output)
# Out: [2, 3, 4]

Dimostrazione dal vivo

Per motivi di leggibilità, tuttavia, dovresti considerare l'utilizzo di for-loops tradizionali. Ciò è particolarmente vero quando la nidificazione è profonda più di 2 livelli e / o la logica della comprensione è troppo complessa. la comprensione di più elenchi di cicli annidati potrebbe essere soggetta a errori o fornire risultati imprevisti.