Вградената функция zip() на Python комбинира елементите на няколко итерабилни обекта (списъци, кортежи и т.н.) и се използва за извличане на елементите на няколко списъка в цикъл for.
Този раздел описва следното използване на функцията zip().
- Получаване на елементите на няколко списъка в цикъл for.
- Работа с различен брой елементи
zip()
:Функцията игнорира елементите, които са твърде много.itertools.zip_longest()
:Тази функция ще попълни липсващите елементи.
- Получаване на списък от кортежи от елементи на няколко итераби.
Получаване на елементите на няколко списъка в цикъл for.
Ако искате да извлечете и използвате елементите на няколко итерабилни обекта (списъци, кортежи и т.н.) едновременно в цикъл for, задайте ги като аргументи на функцията zip().
names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
Не само две, но и три или повече.
points = [100, 85, 90] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 90
Работа с различен брой елементи
Функцията zip() игнорира голям брой елементи.
Във функцията zip(), ако броят на елементите във всеки списък е различен, ще бъде върнат до по-малкия (по-кратък) брой елементи, а по-големият брой ще бъде пренебрегнат.
names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
Функцията itertools.zip_longest() ще попълни липсващите елементи.
С помощта на zip_longest() в модула itertools на стандартната библиотека е възможно да се попълнят липсващите елементи с произволни стойности, когато броят на елементите във всеки списък е различен.
По подразбиране той е запълнен с None.
from itertools import zip_longest names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip_longest(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave None
Ако е посочен аргументът fillvalue, той ще бъде попълнен с тази стойност.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
Дори ако има няколко списъка с липсващи елементи, стойността, която трябва да се попълни, е еднаква. Не е възможно да се задават различни стойности.
points = [100, 85] for name, age, point in zip_longest(names, ages, points, fillvalue=20): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 20 # Dave 20 20
Възможно е да зададете различна стойност, като използвате zip_longest() вътре в zip_longest(), но това не е практично, тъй като трябва предварително да знаете кои елементи от списъка липсват.
Ако искате да попълните няколко списъка с неизвестен брой елементи, всеки от които има различна стойност, можете да използвате следната процедура.
- Определете стойности за попълване за всички списъци.
- Получаване на максималния брой елементи
- Запълване на всички списъци до максималния брой елементи
- Използване на функцията zip()
fill_name = 'XXX' fill_age = 20 fill_point = 50 len_names = len(names) len_ages = len(ages) len_points = len(points) max_len = max(len_names, len_ages, len_points) names = names + [fill_name] * (max_len - len_names) ages = ages + [fill_age] * (max_len - len_ages) points = points + [fill_point] * (max_len - len_points) print(names) print(ages) print(points) # ['Alice', 'Bob', 'Charlie', 'Dave'] # [24, 50, 18, 20] # [100, 85, 50, 50] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
В процеса на попълване до най-голям брой елементи правим следното.
- Иницииране на списък с произволна стойност и брой елементи
- Оператор + за обединяване на списъци
Ако превърнем това във функция, тя ще изглежда по следния начин. Оригиналният списък и стойностите, които запълват списъка, са зададени като аргументи съответно за итераби (списък или кортеж).
def my_zip_longest(iterables, fillvalues): max_len = max(len(i) for i in iterables) return zip(*[list(i) + [v] * (max_len - len(i)) for i, v in zip(iterables, fillvalues)]) for name, age, point in my_zip_longest((names, ages, points), ('XXX', 20, 50)): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
Той използва запис за разбиране на списък и разширяване на списъка чрез *.
- Свързани статии:Използване на нотация за разбиране на списъци в Python
Получаване на списък от кортежи от елементи на няколко итераби.
Функцията zip() връща итератор (обект zip), който представлява кортеж от елементи на множество итерабилни обекти.
Тя може да се използва и извън цикъла for, а целта не е ограничена до списъци.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Ако искате да получите списък от елементите на няколко итерабилни обекта като кортеж, използвайте list(), за да създадете списък.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>