2012-08-03 1 views

risposta

2

[mylist[2*n:2*n+2] for n in xrange(len(mylist)/2)]

Questa soluzione combina l'uso di list comprehension e affettare per estrarre le coppie in sequenza dalla lista originale, e costruire una lista delle fette.

In alternativa, [mylist[n:n+2] for n in xrange(0, len(mylist), 2)] che è lo stesso ad eccezione di xrange conteggi a due invece che a fette. Grazie a Steven Rumbalski per il suggerimento.

E ora qualcosa di completamente diverso: qui è una soluzione di (ab) utilizzando zip e una funzione effimera invece di assegnazione intermedia:

>>> (lambda i: zip(i, i))(iter(mylist)) 
[(1, 2), (3, 4), (5, 6)] 
+5

Più complicato di quello che deve essere - basta passare 'xrange' per 2 e la maggior parte della matematica va via. –

+0

Feedback incorporato. – wberry

9

Yeppers, di lista è il mio solito modo di fare:

>>> groupsize = 2 
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)] 
[[1,2],[3,4],[5,6]] 
>>> groupsize = 3 
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)] 
[[1,2,3],[4,5,6]] 

io uso range per la portabilità, se si sta utilizzando Python 2 (probabilmente sono) cambiare il range per xrange per risparmiare memoria.

6

Un modo alternativo:

zip(mylist[:-1:2], mylist[1::2]) 

che produce una lista di tuple:

>>> zip(mylist[:-1:2],mylist[1::2]) 
[(1, 2), (3, 4), (5, 6)] 

Se davvero si vuole una lista di liste:

map(list, zip(mylist[:-1:2],mylist[1::2])) 
5

Scopri i "cernia "ricetta da itertools documentation:

def grouper(n, iterable, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 
+1

-1. Questo darà 5 coppie su una sequenza di 6 elementi, che non è corretta. Se vuoi una ricetta itertools, dovrebbe essere 'grouper'. –

+0

Hai assolutamente ragione. Risolto come suggerito. –

8

La mia tecnica preferita:

>>> mylist = [1, 2, 3, 4, 5, 6] 
>>> mylist = iter(mylist) 
>>> zip(mylist, mylist) 
[(1, 2), (3, 4), (5, 6)] 

Io di solito uso i generatori invece di liste comunque, quindi la linea 2 di solito non è necessario.

+2

Per maggiore divertimento, cambia lo zip in 'zip (* [milist] * groupsize)' per consentire la dimensione del gruppo generico. Ovviamente, il modo zip ha sempre un problema con la gestione degli elenchi che hanno una lunghezza che non è divisibile per la dimensione del gruppo desiderata. – Josiah

+0

Questo sembra il modo "più poderoso" per farlo. –

+0

@ BrianM.Hunt Non so che sarei d'accordo. Lo zen di python dice "Semplice è meglio del complesso", e se non capisci esattamente come funzionano zip e iteratori, difficilmente si potrebbe chiamare semplice. È certamente il modo più intelligente, però. – Josiah