Próbuję się nauczyć, jak „spakować” listy. W tym celu mam program, w którym w określonym momencie wykonuję następujące czynności:
x1, x2, x3 = stuff.calculations(withdataa)
To daje mi trzy list x1
, x2
i x3
każdy z, powiedzmy, rozmiar 20.
Teraz ja robię:
zipall = zip(x1, x2, x3)
Jednak kiedy to robię:
print "len of zipall %s" % len(zipall)
Dostaję 20, co nie jest tym, czego się spodziewałem. Spodziewałem się trzech. Myślę, że robię coś zasadniczo złego.
python
python-2.7
AJW
źródło
źródło
zip
się zrobić? Dlaczego miałbyś mieć trzy listy - jak by one wyglądały?Odpowiedzi:
Kiedy
zip()
połączysz trzy listy zawierające po 20 elementów każda, wynik będzie miał dwadzieścia elementów. Każdy element to trzy krotki.Sam zobacz:
Aby dowiedzieć się, ile elementów zawiera każda krotka, możesz sprawdzić długość pierwszego elementu:
Oczywiście to nie zadziała, jeśli listy były puste na początku.
źródło
zip
zwrócił listę. W Pythonie 3 jest to iteratorzip
zajmuje kilka list polubieńi „pakuje” je do jednej listy, której wpisy składają się z trzech krotek
(ai, bi, ci)
. Wyobraź sobie, że rysujesz zamek błyskawiczny poziomo od lewej do prawej.źródło
W Pythonie 2.7 mogło to działać dobrze:
Ale w Pythonie 3.4 powinno być (w przeciwnym razie wynik będzie mniej więcej taki
<zip object at 0x00000256124E7DC8>
):źródło
zip
tworzy nową listę, wypełnioną krotkami zawierającymi elementy z iterowalnych argumentów:Spodziewam się, że spróbujesz utworzyć krotkę, w której każdy element jest listą.
źródło
Źródło: Mój post na blogu (lepsze formatowanie)
Przykład
Wejście
Zero lub więcej iterable [1] (np. Lista, ciąg znaków, krotka, słownik)
Wyjście (lista)
i
th tuple = (element_i arg1, element_i arg2…, element_i argn
)Przypadki krawędzi
1) Pusty ciąg: len (str) = 0 = brak krotek
2) Pojedynczy ciąg: len (str) == 2 krotki z len (args) == 1 element (y)
Zip w akcji!
1. Zbuduj słownik [2] z dwóch list
zip
to eleganckie, przejrzyste i zwięzłe rozwiązanie2. Wydrukuj kolumny w tabeli
„*” [3] nazywa się „rozpakowywaniem”:
f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
Dodatkowy kredyt: rozpakowanie
zip(*args)
nazywa się „rozpakowywaniem”, ponieważ ma odwrotny skutekzip
unzipped
: tuple_1 = e1 każdej spakowanej krotki. tuple_2 = e2 każdegozipped
Przypisy
*
Kod:*
wziąłnumbers
(1 argument) i „rozpakował” jego '2 elementy na 2 argumentyźródło
Zasadniczo funkcja zip działa na listach, krotkach i słownikach w Pythonie. Jeśli używasz IPython, po prostu wpisz zip? I sprawdź, o co chodzi w zip ().
Jeśli nie używasz IPythona, po prostu go zainstaluj: "pip install ipython"
Do list
Wynik jest
[('a', 'p'), ('b', 'q'), ('c', 'r')
Do słownika:
Wynik to:
źródło
W Pythonie 3
zip
zamiast tego zwraca iterator i musi zostać przekazany do funkcji listy, aby uzyskać spakowane krotki:Następnie do
unzip
nich z powrotem po prostu skoniuguj spakowany iterator:Jeśli zamiast krotek potrzebna jest oryginalna lista:
źródło
Ze względu na kompletność.
Gdy długości list spakowanych nie są równe. Lista wyników stanie się najkrótszą, bez żadnego błędu
źródło
Myślę, że nie
zip
zwraca listy.zip
zwraca generator. Musisz zrobić,list(zip(a, b))
aby uzyskać listę krotek.źródło
Warto tutaj dodać, ponieważ jest to tak wysoko rankingowe pytanie na zip.
zip
jest świetny, idiomatyczny Python - ale nie skaluje się zbyt dobrze w przypadku dużych list.Zamiast:
Użyj
izip
. W przypadku nowoczesnego przetwarzania przechowuje go w pamięci podręcznej L1 i jest znacznie bardziej wydajny w przypadku większych list. Używaj go tak po prostu, jak dodająci
:źródło