Python, Použití funkce zip(): Získání prvků více seznamů najednou

Podnikání

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.

  1. Definujte hodnoty, které se mají vyplnit pro všechny seznamy.
  2. Získat maximální počet prvků
  3. Vyplnění všech seznamů na maximální počet prvků
  4. 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í *.

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'>