def partition(n, iterable):
p = izip_longest(*([iter(iterable)] * n))
r = []
for x in p:
print(x) #I added this
s = set(x)
s.discard(None)
r.append(list(s))
return r
Questo è in realtà in un annuncio di lavoro su SO e essendo un principiante ho pensato che fosse interessante. Così si ottiene un output come il seguente:Cosa fa questa funzione? (Iteratori di Python)
partition(5, L)
(1, 2, 3, 4, None)
Out[86]: [[1, 2, 3, 4]]
Per me questo è già fonte di confusione perché ho pensato izip_longest(*([iter(iterable)] * n))
sarebbe eseguire la funzione izip_longest
su un elenco di n iteratori identici così mi sarei aspettato prima una potenza di (1,1,1,1,1)
e poi un uscita di (2,2,2,2,2)
e così via.
versione così a corto di mia domanda, è quello che sta succedendo con questa linea:
p = izip_longest(*([iter(iterable)] * n))
analizzarlo avrei pensato [iter (iterable)] * n crea una lista di lunghezza n di iterables identici tutto puntando alla stessa cosa - questo è ciò che fa sulla riga di comando, ma non sembra essere quello che fa qui in base all'output stampato sopra.
Inoltre, ho pensato che * all'inizio fosse ...longest(*...
poiché la lista è di lunghezza sconosciuta, ma non penso che abbia perfettamente senso. Che cos'è il primo simbolo *
all'interno della chiamata di funzione? Non sembra che stia semplicemente indicando una lunghezza sconosciuta di argomenti ...
Quindi alla fine della giornata sono completamente perso. Qualcuno può guidarmi attraverso questa sintassi?
Grazie mille per qualsiasi input!
Grazie per tutte le risposte utili, tutti. Non sono sicuro di voler affrontare una risposta o una domanda qui, ma a me sembra che questa comprensione delle liste farà la stessa cosa per le liste e le tuple (mi rendo conto che gli iteratori si applicherebbero anche a dizionari, corsi personalizzati, altre cose ... .)
[L[i*n:(i+1)*n] for i in range(int(ceil(len(L)/float(n)))) ]
hai letto [Come fa 'zip (* [iter (s)] * n)' work in Python] (http://stackoverflow.com/questions/2233204/how- fa-zipitersn-work-in-python)? –
interrompe una grande lista in elenchi di dimensioni minori di dimensioni N .... compilando Nessuno nel caso in cui la lunghezza della lista non sia divisibile in modo uniforme per N ... l'unica sottolista che dovrebbe contenere qualsiasi 'Nessuna' è l'ultima lista –
Aggiungi una 'print (list (p))' per vedere cosa 'izip_longest()' ha fatto. – martineau