Python, Použitie funkcie zip(): Získanie prvkov viacerých zoznamov naraz

obchodné

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.

  1. Definujte hodnoty, ktoré sa majú vyplniť pre všetky zoznamy.
  2. Získanie maximálneho počtu prvkov
  3. Naplnenie všetkých zoznamov na maximálny počet prvkov
  4. 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 *.

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'>
Copied title and URL