Питхон-ова уграђена функција зип() комбинује елементе вишеструких итеративних објеката (листе, торке, итд.) и користи се за преузимање елемената више листа у фор петљи.
Овај одељак описује следећу употребу функције зип().
- Добијте елементе више листа у фор петљи.
- Рад са различитим бројем елемената
zip()
:Функција ће занемарити елементе којих је превише.itertools.zip_longest()
:Ова функција ће попунити елементе који недостају.
- Добијте листу скупова елемената вишеструких итерабле.
Добијте елементе више листа у фор петљи.
Ако желите да преузмете и користите елементе вишеструких итеративних објеката (листе, торке, итд.) истовремено у фор петљи, наведите их као аргументе функције зип().
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
Рад са различитим бројем елемената
Функција зип() игнорише велики број елемената.
У зип() функцији, ако је број елемената у свакој листи различит, биће враћен до мањи (краћи) број елемената, а већи број ће бити занемарен.
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
Функција итертоолс.зип_лонгест() ће попунити елементе који недостају.
Користећи зип_лонгест() у модулу стандардне библиотеке итертоолс, могуће је попунити елементе који недостају произвољним вредностима када је број елемената у свакој листи различит.
Подразумевано је попуњен са Ништа.
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
Ако је аргумент филлвалуе наведен, он ће бити попуњен том вредношћу.
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
Могуће је навести другачију вредност коришћењем зип_лонгест() унутар зип_лонгест(), али то није практично јер морате унапред знати који елементи листе недостају.
Ако желите да попуните више листа са непознатим бројем елемената, сваки са различитом вредношћу, може се размотрити следећи поступак.
- Дефинишите вредности за попуњавање за све листе.
- Добијте максималан број елемената
- Попуните све листе до максималног броја елемената
- Коришћење функције зип().
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
Користи нотацију за разумевање листе и проширење листе за *.
- Повезани чланци:Коришћење записа разумевања Питхон листе
Добијте листу скупова елемената вишеструких итерабле.
Функција зип() враћа итератор (зип објекат) који је скуп елемената вишеструких итеративних објеката.
Такође се може користити изван фор петље, а циљ није ограничен на листе.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Ако желите да добијете листу елемената вишеструких објеката који се могу понављати као тупле, користите лист() да направите листу.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>