Python, A zip() függvény használata: Több lista elemeinek egyszerre történő kinyerése

Üzleti

A Python beépített zip() függvénye több iterálható objektum (listák, tuplik stb.) elemeit kombinálja, és arra szolgál, hogy egy for ciklusban több lista elemeit lekérje.

Ez a szakasz a zip() függvény következő használatát írja le.

  • Több lista elemeinek kinyerése egy for ciklusban.
  • Különböző számú elem kezelése
    • zip():A függvény figyelmen kívül hagyja a túl sok elemet.
    • itertools.zip_longest():Ez a funkció kitölti a hiányzó elemeket.
  • Több iterábilis elemeiből álló tuplik listájának kinyerése.

Több lista elemeinek kinyerése egy for ciklusban.

Ha egy for ciklusban egyszerre több iterábilis objektum (listák, tuplik stb.) elemeit akarja lekérdezni és felhasználni, adja meg őket a zip() függvény argumentumaként.

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18

Nem csak kettő, hanem három vagy több is.

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

Különböző számú elem kezelése

A zip() függvény figyelmen kívül hagyja a nagyszámú elemet.

A zip() függvényben, ha az egyes listák elemszáma eltérő, akkor a kisebb (rövidebb) elemszámig a kisebb elemszámot adja vissza, a nagyobbat pedig figyelmen kívül hagyja.

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

Az itertools.zip_longest() függvény kitölti a hiányzó elemeket.

A standard könyvtár itertools moduljában található zip_longest() segítségével a hiányzó elemeket tetszőleges értékekkel lehet kitölteni, ha az egyes listák elemszáma eltérő.

Alapértelmezés szerint nincs kitöltve.

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

Ha a fillvalue argumentum meg van adva, akkor az adott értékkel lesz kitöltve.

for name, age in zip_longest(names, ages, fillvalue=20):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18
# Dave 20

Még ha több lista is van hiányzó elemekkel, a kitöltendő érték egységes. Különböző értékek megadása nem lehetséges.

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

Lehetséges más értéket is megadni a zip_longest() segítségével a zip_longest() függvényen belül, de ez nem praktikus, mert előre tudnunk kell, hogy a lista mely elemei hiányoznak.

Ha több listát akarunk feltölteni ismeretlen számú elemmel, amelyek mindegyike más-más értékkel rendelkezik, akkor a következő eljárás jöhet szóba.

  1. Meghatározza az összes lista kitöltendő értékeit.
  2. Az elemek maximális számának lekérdezése
  3. Minden lista kitöltése a maximális elemszámig
  4. A zip() függvény használata
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

A legnagyobb elemszámig történő feltöltés során a következőket tesszük.

  • Egy lista inicializálása tetszőleges értékkel és elemszámmal
  • + operátor listák összekapcsolására

Ha ezt egy függvénnyé alakítjuk, akkor így néz ki. Az eredeti listát és a listát kitöltő értékeket iterábilis (lista vagy tuple) argumentumként adjuk meg.

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

Használja a listamegértés jelölését és a lista *-gal való bővítését.

Több iterábilis elemeiből álló tuplik listájának kinyerése.

A zip() függvény egy iterátort (zip objektumot) ad vissza, amely több iterálható objektum elemeinek tuple-ja.
A for cikluson kívül is használható, és a cél nem korlátozódik listákra.

names = ['Alice', 'Bob', 'Charlie']
ages = (24, 50, 18)

z = zip(names, ages)
print(z)
print(type(z))
# <zip object at 0x10b57b888>
# <class 'zip'>

Ha több iterábilis objektum elemeinek listáját szeretnéd egy tuple-ként megkapni, használd a list() funkciót, hogy listát készíts.

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