2012-08-03 18 views

Odpowiedz

2

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

Takie rozwiązanie umożliwia wykorzystanie listy listowe i krojenia do ekstrakcji pary, w ciągu od pierwotnej liście i utworzyć listę plastrów.

Alternatywnie, [mylist[n:n+2] for n in xrange(0, len(mylist), 2)], który jest taki sam, z wyjątkiem xrange liczy się przez dwa zamiast plasterków. Podziękowania dla Stevena Rumbalskiego za sugestię.

A teraz coś z zupełnie innej beczki: tu jest rozwiązanie (ab) używając zip i ulotne funkcja zamiast przypisania pośrednie:

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

Bardziej skomplikowane niż to konieczne - wystarczy przesunąć 'xrange' o 2 i większość matematyki zniknie. –

+0

Sprzężenie zwrotne włączone. – wberry

9

Yeppers lista Rozumienie jest mój zwykły sposób to zrobić:

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

używam range do przenoszenia, jeśli używasz Pythona 2 (zapewne są) zmienić range do xrange aby zaoszczędzić pamięć.

6

Alternatywny sposób:

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

która produkuje listę krotek:

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

Jeśli naprawdę chcesz listę list:

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

Sprawdź „panterka "przepis z 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. Da to 5 par w sekwencji 6 elementów, która jest niepoprawna. Jeśli chcesz przepis itertools, powinien on być 'grouper'. –

+0

Masz całkowitą rację. Naprawiono zgodnie z sugestią. –

8

Moja preferowana technika:

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

Zwykle używam generatorów zamiast list tak, więc linia 2 zwykle nie jest wymagane.

+2

Dla dodatkowej zabawy zmień zip na 'zip (* [mylist] * groupize)', aby umożliwić ogólny rozmiar grupy. Oczywiście, sposób zip zawsze będzie miał problem z obsługą list, które mają długość, która nie jest podzielna przez pożądany rozmiar grupy. – Josiah

+0

Wydaje się to być "najbardziej pythonic" sposób to zrobić. –

+0

@ BrianM.Hunt Nie wiem, czy bym się z tym zgodził. Zen z Pythona mówi: "Prostota jest lepsza niż złożona", a jeśli nie rozumiesz dokładnie, jak działa zip i iteratory, nie można nazwać tego prostym. Jest to z pewnością najbardziej sprytny sposób. – Josiah

Powiązane problemy