2016-02-06 11 views
5

Mam następujące wykazy jak na przykład:Python, zip wiele list, gdzie jedna lista wymaga dwóch elementów każdy

a = ['#12908069', '#12906115', '#12904949', '#12904654', '#12904288', '#12903553']  
b = ['85028,', '83646,', '77015,', '90011,', '91902,', '80203,']  
c = ['9.09', '9.09', '1.81', '3.62', '1.81', '1.81', '9.09', '9.09', '1.81', '3.62', '1.81', '1.81']  
d = ['Zone 3', 'Zone 3', 'Zone 2'] 

Co chciałbym osiągnąć jako wyjście, pierwszy zestaw poz zipped jako przykład :

[('#12908069', '85028', (9.09, 9.09), 'Zone 3'), ...] 

Jak uzyskać zip() dodać dodatkowy przedmiot dla każdej krotki z listy c?

Odpowiedz

5

pomocą zwrotem określającym grupowanie serii danych do grup N długości z zip documentation:

>>> gr = [iter(c)]*2 
>>> list(zip(a, b, zip(*gr), d)) 
[('#12908069', '85028,', ('9.09', '9.09'), 'Zone 3'), 
('#12906115', '83646,', ('1.81', '3.62'), 'Zone 3'), 
('#12904949', '77015,', ('1.81', '1.81'), 'Zone 2')] 

Zasadniczo, w celu uzyskania dwóch następujących po sobie elementów z listy c kładziemy samą iterację na nią w lista gr, która składa się z dwóch elementów.

Następnie przekazujemy te same iteratory do rozpakowania (rozpakowanie listy, tak jakbyśmy przekazali dwa iteratory jako dwa oddzielne argumenty).

To powoduje zebranie dwóch kolejnych elementów z listy c.

Następnie przekazujemy taki plik zip i inne listy do ponownego zipowania, aby zeskanować i sparować całość.

+0

To jest sprytne, ale bardzo nie do utrzymania IMO, musiałem owinąć sobie głowę 2 kopiami odniesienie do tego samego iteratora – Aprillion

+1

@Apillion taki idiom jest dość powszechny dla grupowania serii danych na grupy n-length – Pynchia

+0

hmm, wygląda na to, że zostało dodane do dokumentacji - https://bugs.python.org/issue23695 - Będę po prostu trzeba się do tego przyzwyczaić :) – Aprillion

2

użyciu jednej z recipes z itertools:

>>> from itertools import zip_longest 
>>> 
>>> def grouper(iterable, n, fillvalue=None): 
...  "Collect data into fixed-length chunks or blocks" 
...  # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
...  args = [iter(iterable)] * n 
...  return zip_longest(*args, fillvalue=fillvalue) 
... 
>>> list(zip(a, b, grouper(c, 2), d)) 
[('#12908069', '85028,', ('9.09', '9.09'), 'Zone 3'), ('#12906115', '83646,', ('1.81', '3.62'), 'Zone 3'), ('#12904949', '77015,', ('1.81', '1.81'), 'Zone 2')] 
0

Wypróbuj poniższy kod:

a = ['#12908069', '#12906115', '#12904949', '#12904654', '#12904288', '#12903553'] 
b = ['85028,', '83646,', '77015,', '90011,', '91902,', '80203,'] 
c = ['9.09', '9.09', '1.81', '3.62', '1.81', '1.81', '9.09', '9.09', '1.81', '3.62', '1.81', '1.81'] 
d = ['Zone 3', 'Zone 3', 'Zone 2'] 

result = list(zip(a, b, [(c[i*2],c[i*2+1]) for i in range(len(c)//2)], d)) 
print(result) 
+0

'result = list (zip (...' zrobi, nie ma potrzeby 'i, j, m, n' – Pynchia

+1

@Pynchia Dzięki za wskazanie tego, zmieniłem go. – Ren