Vestavěná funkce zip() jazyka Python spojuje prvky více iterovatelných objektů (seznamů, tuplů atd.) a používá se k získání prvků více seznamů v cyklu for.
Tato část popisuje následující použití funkce zip().
- Získání prvků více seznamů v cyklu for.
- Práce s různým počtem prvků
zip()
:Funkce bude ignorovat prvky, kterých je příliš mnoho.itertools.zip_longest()
:Tato funkce doplní chybějící prvky.
- Získání seznamu tuplů prvků více iterabilních tabulek.
Získání prvků více seznamů v cyklu for.
Pokud chcete v cyklu for načíst a použít prvky více iterovatelných objektů (seznamů, tuplů atd.) najednou, zadejte je jako argumenty funkce 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
Nejen dva, ale i tři a více.
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áce s různým počtem prvků
Funkce zip() ignoruje velký počet prvků.
Pokud se ve funkci zip() liší počet prvků v jednotlivých seznamech, bude vrácen až menší (kratší) počet prvků a větší počet bude ignorován.
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
Funkce itertools.zip_longest() doplní chybějící prvky.
Pomocí funkce zip_longest() v modulu itertools standardní knihovny je možné doplnit chybějící prvky libovolnými hodnotami, pokud se počet prvků v jednotlivých seznamech liší.
Ve výchozím nastavení je vyplněna 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
Pokud je zadán argument fillvalue, bude vyplněn touto hodnotou.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
I když existuje více seznamů s chybějícími prvky, hodnota, která se má vyplnit, je jednotná. Není možné zadat různé 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é zadat jinou hodnotu pomocí funkce zip_longest() uvnitř funkce zip_longest(), ale není to praktické, protože je třeba předem vědět, které prvky seznamu chybí.
Pokud chcete vyplnit více seznamů s neznámým počtem prvků, z nichž každý má jinou hodnotu, můžete použít následující postup.
- Definujte hodnoty, které se mají vyplnit pro všechny seznamy.
- Získat maximální počet prvků
- Vyplnění všech seznamů na maximální počet prvků
- Použití funkce 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
Při vyplňování až do největšího počtu prvků postupujeme následovně.
- Inicializace seznamu s libovolnou hodnotou a počtem prvků
- operátor + pro spojování seznamů
Pokud to převedeme na funkci, vypadá to takto. Původní seznam a hodnoty, kterými je seznam naplněn, jsou zadány jako argumenty iterables (seznam, 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žívá notaci pro porozumění seznamu a rozšíření seznamu pomocí *.
- Související články:Použití notace seznamů v jazyce Python
Získání seznamu tuplů prvků více iterabilních tabulek.
Funkce zip() vrací iterátor (objekt zip), který je tuplem prvků více iterovatelných objektů.
Lze ji použít i mimo cyklus for a cíl není omezen na seznamy.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Pokud chcete získat seznam prvků více iterovatelných objektů jako tuple, použijte funkci list() a vytvořte seznam.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>