Listy Zip w Pythonie
Staram się nauczyć, jak" zip " listy. W tym celu mam program, w którym w danym momencie wykonuję następujące czynności:
x1, x2, x3 = stuff.calculations(withdataa)
To daje mi trzy listy, x1
, x2
, i x3
, każdy, powiedzmy, Rozmiar 20.
Teraz tak:
zipall = zip(x1, x2, x3)
Jednakże, kiedy to robię:
print "len of zipall %s" % len(zipall)
Dostaję 20, czego się nie spodziewałem. Spodziewałem się trzech. Myślę, że robię coś zasadniczo złego. 10 answers
Kiedy zip()
razem trzy listy zawierające 20 elementów każda, wynik ma dwadzieścia elementów. Każdy element ma trzy krotki.
Zobaczcie sami:
In [1]: a = b = c = range(20)
In [2]: zip(a, b, c)
Out[2]:
[(0, 0, 0),
(1, 1, 1),
...
(17, 17, 17),
(18, 18, 18),
(19, 19, 19)]
Aby dowiedzieć się, ile elementów zawiera każda krotka, możesz sprawdzić długość pierwszego elementu:
In [3]: result = zip(a, b, c)
In [4]: len(result[0])
Out[4]: 3
Oczywiście to nie zadziała, jeśli Listy będą puste.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 14:15:11
zip
takes a bunch of list likes
a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...
I "zamyka" je w jedną listę, której wpisy są 3-krotkami (ai, bi, ci)
. Wyobraź sobie rysowanie zamka poziomo od lewej do prawej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 14:18:25
W Pythonie 2.7 to mogło zadziałać dobrze:
>>> a = b = c = range(20)
>>> zip(a, b, c)
Ale w Pythonie 3.4 powinno być (w przeciwnym razie wynik będzie podobny <zip object at 0x00000256124E7DC8>
):
>>> a = b = c = range(20)
>>> list(zip(a, b, c))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:39:31
zip
tworzy nową listę, wypełnioną krotkami zawierającymi elementy z argumentów iteracyjnych:
>>> zip ([1,2],[3,4])
[(1,3), (2,4)]
Spodziewam się, że spróbujesz stworzyć krotkę, w której każdy element jest listą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 14:17:12
Źródło: mój wpis na blogu (lepsze formatowanie)
Przykład
numbers = [1,2,3]
letters = 'abcd'
zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]
Input
Zero lub więcej iterabli [1] (ex. list, string, tuple, dictionary)
Output (list)
Pierwsza krotka = (element_1 liczb, element_1 liter)
Druga krotka = (liczby e_2, litery e_2)
…
N-ta krotka = (liczby e_n, litery e_n)
- lista N krotki: n jest długością najkrótszego argumentu (wejście)
- len(liczby) == 3
- Długość każdej krotki = # args (krotka pobiera element z każdego arg)
- args = (liczby, litery); len(args) = = 2 → krotka z 2 elementami
-
i
th tuple = (element_i arg1, element_i arg2..., element_i argn
)
Edge Cases
1) Empty String: len (str)= 0 = brak krotek
2) pojedynczy ciąg znaków: len (str) == 2 krotki z len(args) = = 1 element(Y)
zip()
# []
zip('')
# []
zip('hi')
# [('h',), ('i',)]
Zip w akcji!
1. Zbuduj słownik [2] z dwóch list
keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]
my_favorite = dict( zip(keys, values) )
my_favorite["drink"]
# 'La Croix'
my_faves = dict()
for i in range(len(keys)):
my_faves[keys[i]] = values[i]
- Jest eleganckim, przejrzystym i zwięzłym rozwiązaniem.]}
2. Drukowanie kolumn w tabeli
"*" [3] nazywa się "rozpakowywanie": f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
student_grades = [
[ 'Morty' , 1 , "B" ],
[ 'Rick' , 4 , "A" ],
[ 'Jerry' , 3 , "M" ],
[ 'Kramer' , 0 , "F" ],
]
row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']
columns = zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')
Dodatkowy Kredyt: Rozpakowanie
zip(*args)
nazywa się " rozpinanie" ponieważ ma efekt odwrotny zip
numbers = (1,2,3)
letters = ('a','b','c')
zipped = zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]
unzipped = zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
-
unzipped
: krotka_1 = e1 każdej krotki. tuple_2 = E2 każdegozipped
Przypisy
- obiekt zdolny do zwracania swoich członków pojedynczo (ex. lista [1,2,3], string 'I like codin', tuple (1,2,3), dictionary {'a':1, 'b':2})
- {key1: value1, key2: value2...}
- "rozpakowywanie" (*)
*
kod:
# foo - function, returns sum of two arguments
def foo(x,y):
return x + y
print foo(3,4)
# 7
numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)
print foo(*numbers)
# 3
*
taken numbers
(1 arg) i "unpaked" its ' 2 elements into 2 args
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 02:11:04
W Python 3 zip
zamiast tego zwraca iterator i musi zostać przekazany do funkcji list, aby uzyskać zipped krotki:
x = [1, 2, 3]; y = ['a','b','c']
z = zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]
Następnie do unzip
je z powrotem wystarczy podłączyć zipped iterator:
x_back, y_back = zip(*z)
print(x_back); print(y_back)
>>> (1, 2, 3)
>>> ('a', 'b', 'c')
Jeśli potrzebna jest oryginalna forma listy zamiast krotek:
x_back, y_back = zip(*z)
print(list(x_back)); print(list(y_back))
>>> [1,2,3]
>>> ['a','b','c']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 06:22:21
Zasadniczo funkcja zip działa na listach, krotkach i słownikach w Pythonie. Jeśli używasz IPython to po prostu wpisz zip? I sprawdź o co chodzi z zip ().
Jeśli nie używasz Ipythona, zainstaluj go: "pip install ipython"Dla list
a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
zip(a, b)
Wyjście to [('a', 'p'), ('b', 'q'), ('c', 'r')
Dla słownika:
c = {'gaurav':'waghs', 'nilesh':'kashid', 'ramesh':'sawant', 'anu':'raje'}
d = {'amit':'wagh', 'swapnil':'dalavi', 'anish':'mane', 'raghu':'rokda'}
zip(c, d)
Wyjście To:
[('gaurav', 'amit'),
('nilesh', 'swapnil'),
('ramesh', 'anish'),
('anu', 'raghu')]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:36:48
Dla kompletności.
Gdy długość listy nie jest równa. Długość listy wynikowej będzie Najkrótsza bez wystąpienia błędu
>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-20 21:52:56
Warto dodać tutaj, ponieważ jest to tak wysoko oceniane pytanie na zip. zip
jest świetnym, idiomatycznym Pythonem-ale nie skaluje się zbyt dobrze w przypadku dużych list.
Zamiast:
books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
words = [345, 567, ... , 672]
for book, word in zip(books, words):
print('{}: {}'.format(book, word))
Użyj izip
. W przypadku nowoczesnego przetwarzania przechowuje go w pamięci podręcznej L1 i jest znacznie bardziej wydajny dla większych list. Użyj go tak po prostu, jak dodanie i
:
for book, word in izip(books, words):
print('{}: {}'.format(book, word))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-23 13:57:22
Myślę, że zip
nie zwraca listy. zip
zwraca generator. Musisz zrobić list(zip(a, b))
, aby uzyskać listę krotek.
x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
list(zipped)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:42:08