2012-08-03 2 views

Antwort

2

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

Diese Lösung kombiniert die Verwendung von Listen Comprehensions und Slicing Paare in der Reihenfolge von der ursprünglichen Liste, zu extrahieren, und eine Liste der Scheiben zu bauen.

Alternativ [mylist[n:n+2] for n in xrange(0, len(mylist), 2)] das ist das gleiche außer xrange zählt zu zweit statt der Scheiben. Danke an Steven Rumbalski für den Vorschlag.

Und jetzt etwas ganz anderes: hier eine Lösung (ab) ist zip und eine ephemere Funktion anstelle von Zwischenbelegung mit:

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

Komplizierter als es sein muss - nur Schritt "Xrange" von 2 und die meisten Mathe geht weg. –

+0

Feedback hinzugefügt. – wberry

9

Yeppers, Liste Verständnis ist meine übliche Art und Weise tun:

>>> 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]] 

ich benutze range für Portabilität, wenn Sie python verwenden 2 (Sie wahrscheinlich sind) ändern, um die range zu xrange Speicher zu speichern.

6

Eine alternative Art und Weise:

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

, die eine Liste von Tupeln erzeugt:

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

Wenn Sie wirklich eine Liste von Listen wollen:

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

Schauen Sie sich die „Grouper "Rezept aus der 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. Dies ergibt 5 Paare auf einer 6-Item-Sequenz, was inkorrekt ist. Wenn Sie ein Ititertools Rezept wollen, sollte es "Grouper" sein. –

+0

Sie sind absolut richtig. Wie vorgeschlagen behoben. –

8

Meine bevorzugte Technik:

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

ich in der Regel Generatoren anstelle von Listen wie auch immer, so Zeile 2 in der Regel nicht erforderlich ist.

+2

Für zusätzlichen Spaß, ändern Sie die Zip zu 'Zip (* [Meine Liste] * Gruppengröße)', um die generische Gruppengröße zu ermöglichen. Natürlich wird die Zip-Methode immer ein Problem mit der Handhabung von Listen haben, die eine Länge haben, die nicht durch die gewünschte Gruppengröße teilbar ist. – Josiah

+0

Dies scheint der "pythischste" Weg zu sein. –

+0

@ BrianM.Hunt Ich weiß nicht, dass ich dem zustimmen würde. Das Zen von Python sagt "Einfach ist besser als komplex", und wenn Sie nicht genau verstehen, wie Zip und Iteratoren funktionieren, könnte man das nicht einfach nennen. Es ist sicherlich der cleverste Weg, obwohl. – Josiah