La migliore fonte di informazioni è il tutorial ufficiale di Python sulla comprensione delle liste . Le comprensioni di lista sono quasi le stesse dei cicli for (certamente qualsiasi comprensione di lista può essere scritta come un ciclo for) ma sono spesso più veloci rispetto all'uso di un ciclo for.
Guarda questa comprensione della lista più lunga dal tutorial (la if
parte filtra la comprensione, solo le parti che passano l'istruzione if vengono passate nella parte finale della comprensione della lista (qui (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
È esattamente lo stesso di questo ciclo for annidato (e, come dice il tutorial, nota come l'ordine di for e if sono gli stessi).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
La principale differenza tra una comprensione della lista e un ciclo for è che la parte finale del ciclo for (dove si fa qualcosa) arriva all'inizio piuttosto che alla fine.
Alle tue domande:
Che tipo deve essere l'oggetto per poter utilizzare questo per la struttura del ciclo?
Un iterabile . Qualsiasi oggetto in grado di generare un insieme (finito) di elementi. Questi includono qualsiasi contenitore, elenco, set, generatore, ecc.
Qual è l'ordine in cui i e j sono assegnati agli elementi in oggetto?
Sono assegnati esattamente nello stesso ordine in cui sono generati da ciascuna lista, come se fossero in un ciclo for annidato (per la tua prima comprensione otterrai 1 elemento per i, quindi ogni valore da j, secondo elemento in i, quindi ogni valore da j, ecc.)
Può essere simulato da una diversa struttura per loop?
Sì, già mostrato sopra.
Può questo ciclo for essere annidato con una struttura simile o diversa per ciclo? E come sarebbe?
Certo, ma non è una grande idea. Qui, ad esempio, ti offre un elenco di elenchi di caratteri:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]