Vstavaná funkcia zip() jazyka Python kombinuje prvky viacerých iterovateľných objektov (zoznamov, tuplov atď.) a používa sa na získanie prvkov viacerých zoznamov v cykle for.
Táto časť opisuje nasledujúce použitie funkcie zip().
- Získanie prvkov viacerých zoznamov v cykle for.
- Práca s rôznym počtom prvkov
zip()
:Funkcia bude ignorovať prvky, ktorých je príliš veľa.itertools.zip_longest()
:Táto funkcia doplní chýbajúce prvky.
- Získanie zoznamu tuplov prvkov viacerých iterabilít.
Získanie prvkov viacerých zoznamov v cykle for.
Ak chcete v cykle for získať a použiť prvky viacerých iterovateľných objektov (zoznamov, tuplov atď.) súčasne, zadajte ich ako argumenty funkcie 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
Nielen dve, ale aj tri alebo viac.
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
Práca s rôznym počtom prvkov
Funkcia zip() ignoruje veľký počet prvkov.
Ak sa vo funkcii zip() počet prvkov v jednotlivých zoznamoch líši, vráti sa až menší (kratší) počet prvkov a väčší počet sa ignoruje.
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
Funkcia itertools.zip_longest() doplní chýbajúce prvky.
Pomocou funkcie zip_longest() v module itertools štandardnej knižnice je možné doplniť chýbajúce prvky ľubovoľnými hodnotami, ak je počet prvkov v každom zozname iný.
V predvolenom nastavení je vyplnená hodnotou 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
Ak je zadaný argument fillvalue, vyplní sa touto hodnotou.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
Aj keď existuje viacero zoznamov s chýbajúcimi prvkami, hodnota, ktorá sa má vyplniť, je jednotná. Nie je možné zadať rôzne hodnoty.
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
Je možné zadať inú hodnotu pomocou funkcie zip_longest() vo vnútri funkcie zip_longest(), ale nie je to praktické, pretože musíte vopred vedieť, ktoré prvky zoznamu chýbajú.
Ak chcete vyplniť viacero zoznamov s neznámym počtom prvkov, z ktorých každý má inú hodnotu, môžete použiť nasledujúci postup.
- Definujte hodnoty, ktoré sa majú vyplniť pre všetky zoznamy.
- Získanie maximálneho počtu prvkov
- Naplnenie všetkých zoznamov na maximálny počet prvkov
- Použitie funkcie 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
Pri vypĺňaní až do najväčšieho počtu prvkov postupujeme nasledovne.
- Inicializácia zoznamu s ľubovoľnou hodnotou a počtom prvkov
- operátor + na spájanie zoznamov
Ak to premeníme na funkciu, bude to vyzerať takto. Pôvodný zoznam a hodnoty, ktoré zoznam napĺňajú, sú zadané ako argumenty iterables (zoznam, resp. tuple).
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
Používa zápis porozumenia zoznamu a rozšírenie zoznamu pomocou *.
- Súvisiace články:Používanie notácie zoznamov jazyka Python
Získanie zoznamu tuplov prvkov viacerých iterabilít.
Funkcia zip() vracia iterátor (objekt zip), ktorý je tuplom prvkov viacerých iterovateľných objektov.
Možno ho použiť aj mimo cyklu for a cieľ nie je obmedzený na zoznamy.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Ak chcete získať zoznam prvkov viacerých iterovateľných objektov ako tuple, použite funkciu list() na vytvorenie zoznamu.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>