2011-01-10 32 views
13

Powiel możliwe:
Pairs from single listzbierać każdą parę elementów z listy do krotek w Pythonie

Mam listę małych liczb całkowitych, powiedzieć:

[1, 2, 3, 4, 5, 6] 

Chciałbym zebrać pary sekwencyjne i zwrócić nową listę zawierającą krotki utworzone z tych par, tj .:

[(1, 2), (3, 4), (5, 6)] 

Wiem, że musi istnieć naprawdę prosty sposób, aby to zrobić, ale nie mogę go rozwiązać.

Dzięki

+4

Czy to zadanie domowe? Jeśli tak, użyj tagu [praca domowa]. –

+2

możliwy duplikat [par z pojedynczej listy] (http://stackoverflow.com/questions/4628290/pairs-from-single-list) i wiele innych. –

+0

@ S.Lott, dlaczego to może być praca domowa? Czy to wygląda z twojego doświadczenia? –

Odpowiedz

26

Dobrze Jest jedna bardzo prosta, ale nieco kruchy sposób, zip go z plastrami wersji siebie.

zipped = zip(mylist[0::2], mylist[1::2]) 

Jeśli nie wiesz, ostatnim parametrem przekroju jest "krok". Wybieramy co drugi element na liście, począwszy od zera (1, 3, 5). Następnie robimy to samo, ale zaczynając od jednego (2, 4, 6) i robiąc z nich krotki z zip.

+0

Dlaczego jest to kruche? –

+4

Nieparzysta liczba elementów może dać zaskakujące wyniki. Również lista o zerowej długości będzie źle działać. –

4

Prosto z dokumentacją Pythona modułu itertools:

from itertools import tee, izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

l = [1, 2, 3, 4, 5, 6] 
for pair in pairwise(l): 
    print pair 
+0

+1. Tak, nadszedł bardziej niezawodny sposób: D – Skurmedel

+5

To niezupełnie daje to, czego żądał OP - wypisuje '(1, 2), (2, 3), (3, 4), (4, 5), (5, 6) 'zamiast' (1, 2), (3, 4), (5, 6) ' –

+3

Właściwą funkcją jest' grouper', tuż pod tym w przepisach itertools;) –

1

Oprócz powyższych odpowiedzi, trzeba także wiedzieć, najprostszy sposób zbyt (jeśli nie już znane)

l = [1, 2, 3, 4, 5, 6] 
o = [(l[i],l[i+1]) for i in range(0,len(l),2)] 
+0

Całkowicie bym zapomniałem o opcjonalnym parametrze kroku do zakresu – TartanLlama

+0

, dlaczego odejmujesz 2 od długości? to jest źle. – SilentGhost

+1

Spowoduje to dyskretne upuszczenie ostatniego elementu listy o nieparzystej długości. Czy to właściwe? A może powinien podnieść jakiś wyjątek? –

0

Oprócz powyższych odpowiedzi, trzeba także wiedzieć, najprostszy sposób zbyt (jeśli nie już znane)

l = [1, 2, 3, 4, 5, 6] 
o = [(l[i],l[i+1]) for i in range(0,len(l)-2,2)] 

tutaj powinno być o = [(l[i],l[i+1]) for i in range(0,len(l),2)], jak range(0, len(l) - 2, 2) będzie tylko generować 0 i 2

+0

Dzięki Meng, poprawiłem błąd powyżej. –

+0

Proszę poprawnie sformatować swój kod. Użyj przycisku '{}'. –

Powiązane problemy