2013-02-21 13 views

risposta

49

Il primo si 0 o più argomenti, ciascuno un iterabile, la seconda accetta un argomento che dovrebbe produrre i iterabili:

itertools.chain(list1, list2, list3) 

iterables = [list1, list2, list3] 
itertools.chain.from_iterable(iterables) 

ma iterables può essere qualsiasi iteratore che produce i iterabili.

def generate_iterables(): 
    for i in range(10): 
     yield range(i) 

itertools.chain.from_iterable(generate_iterables()) 

Utilizzando la seconda forma è di solito un caso di convenienza, ma perché loop sull'ingresso iterables pigramente, è anche l'unico modo è possibile concatenare un infinita numero di iteratori finite:

def generate_iterables(): 
    while True: 
     for i in range(5, 10): 
      yield range(i) 

itertools.chain.from_iterable(generate_iterables()) 

L'esempio sopra vi darà un iterabile che produce un modello ciclico di numeri che non potrà mai fermare, ma non sarà mai consumerà più memoria di quello che richiede una singola range() chiamata.

+2

Non riesco ancora a capirlo. puoi darmi la differenza di output e utilizzare case nella situazione pratica in cui utilizzare cosa – user1994660

+8

@ user1994660: non c'è differenza di uscita. È una differenza * di input *. Rende più facile l'uso di determinati input. –

+0

@ user1994660: Io uso la seconda forma di [questa risposta] (http://stackoverflow.com/questions/12900444/trying-to-add-to-dictionary-values-by-counting-occurrences-in-a-list -di-liste-p/12900577 # 12900577). –

1

fanno cose molto simili. Per il numero ridotto di iterables itertools.chain(*iterables) e itertools.chain.from_iterable(iterables), eseguire in modo simile.

Il vantaggio principale di from_iterables risiede nella capacità di gestire gran numero (potenzialmente infinito) di iterables poiché sono tenuti tutti non essere disponibili al momento della chiamata.

Problemi correlati