2014-11-15 12 views
7

Quello che sto cercando di fare è piuttosto semplice, ma non sono riuscito a trovare come farlo.Come dividere Python elenca ogni elemento Nth

  • A partire dal 1 ° elemento, inserire ogni 4 elementi in una nuova lista.
  • Ripetere con il 2 °, 3 ° e 4 ° elementi.

Da:

list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 

A:

list1 = ['1', '5', '9'] 
list2 = ['2', '6', 'a'] 
list3 = ['3', '7', 'b'] 
list4 = ['4', '9'] 

In altre parole, ho bisogno di sapere come:

  • Prendi l'elemento ennesimo da un elenco (in un ciclo)
  • Memorizzarlo nei nuovi array
  • Ripetere
+1

Non generare nuove variabili. Memorizza invece le tue liste in un elenco genitore. –

risposta

13

La soluzione specifica è quella di utilizzare per affettare con una falcata:

source = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 
list1 = source[::4] 
list2 = source[1::4] 
list3 = source[2::4] 
list4 = source[3::4] 

source[::4] prende ogni quarto elemento, a partire dall'indice 0; le altre fette modificano solo l'indice iniziale.

La soluzione generica è quella di utilizzare un ciclo per eseguire l'affettamento e archiviare il risultato in una lista esterna; un elenco di comprensione può fare che bene:

def slice_per(source, step): 
    return [source[i::step] for i in range(step)] 

Demo:

>>> source = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 
>>> source[::4] 
['1', '5', '9'] 
>>> source[1::4] 
['2', '6', 'a'] 
>>> def slice_per(source, step): 
...  return [source[i::step] for i in range(step)] 
... 
>>> slice_per(source, 4) 
[['1', '5', '9'], ['2', '6', 'a'], ['3', '7', 'b'], ['4', '8']] 
>>> slice_per(source, 3) 
[['1', '4', '7', 'a'], ['2', '5', '8', 'b'], ['3', '6', '9']] 
+0

Perché non trasformarlo in un generatore? Gestirà anche il caso infinito allora. –

+0

@EdgarKlerks: Dovresti creare 'n'' islice' iterators allora. –

+0

@EdgarKlerks: il che significa che dovrai ritirare l'input iterabile e che potrebbe diventare molto costoso, in termini di memoria. –

2

I nomi numerati sono una cattiva idea, e non si dovrebbe nominare il proprio variabile list (che ombre il built-in), ma in generale si può fare qualcosa di simile:

>>> startlist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 
>>> n = 4 
>>> endlist = [[] for _ in range(n)] 
>>> for index, item in enumerate(startlist): 
    endlist[index % n].append(item) 


>>> endlist 
[['1', '5', '9'], ['2', '6', 'a'], ['3', '7', 'b'], ['4', '8']]