Python, Uporaba funkcije zip(): Pridobivanje elementov več seznamov naenkrat

Posel

Pythonova vgrajena funkcija zip() združuje elemente več iterabilnih objektov (seznamov, tuplov itd.) in se uporablja za pridobivanje elementov več seznamov v zanki for.

V tem razdelku je opisana naslednja uporaba funkcije zip().

  • Pridobivanje elementov več seznamov v zanki for.
  • Obravnava različnega števila elementov
    • zip():Funkcija ne bo upoštevala elementov, ki so preveliki.
    • itertools.zip_longest():Ta funkcija dopolni manjkajoče elemente.
  • Pridobi seznam nizov elementov več iterablov.

Pridobivanje elementov več seznamov v zanki for.

Če želite v zanki for hkrati pridobiti in uporabiti elemente več iterabilnih objektov (seznamov, tuplov itd.), jih navedite kot argumente funkcije 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

Ne samo dva, ampak tudi tri ali več.

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

Obravnava različnega števila elementov

Funkcija zip() ne upošteva velikega števila elementov.

Če je v funkciji zip() število elementov v vsakem seznamu različno, se vrne največ manjše (krajše) število elementov, večje število pa se ne upošteva.

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

Funkcija itertools.zip_longest() bo dopolnila manjkajoče elemente.

Z uporabo funkcije zip_longest() v modulu itertools standardne knjižnice je mogoče manjkajoče elemente zapolniti s poljubnimi vrednostmi, kadar je število elementov v vsakem seznamu različno.

Privzeto je izpolnjen z vrednostjo 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

Če je naveden argument fillvalue, se zapolni s to vrednostjo.

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

Tudi če obstaja več seznamov z manjkajočimi elementi, je vrednost, ki jo je treba izpolniti, enotna. Ni mogoče določiti različnih vrednosti.

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

Z uporabo funkcije zip_longest() znotraj funkcije zip_longest() je mogoče določiti drugačno vrednost, vendar to ni praktično, saj morate vnaprej vedeti, kateri elementi seznama manjkajo.

Če želite napolniti več seznamov z neznanim številom elementov, od katerih ima vsak drugačno vrednost, lahko uporabite naslednji postopek.

  1. Opredelite vrednosti, ki jih je treba izpolniti za vse sezname.
  2. Pridobi največje število elementov
  3. Izpolnite vse sezname do največjega števila elementov
  4. Uporaba funkcije 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 polnjenju do največjega števila elementov naredimo naslednje.

  • Inicializacija seznama s poljubno vrednostjo in številom elementov
  • operator + za združevanje seznamov

Če to spremenimo v funkcijo, je videti takole. Izvirni seznam in vrednosti, ki zapolnjujejo seznam, so navedeni kot argumenti iterables (seznam ali 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

Uporablja zapis za razumevanje seznama in razširitev seznama z *.

Pridobi seznam nizov elementov več iterablov.

Funkcija zip() vrne iterator (objekt zip), ki je skupek elementov več iterabilnih objektov.
Uporablja se lahko tudi zunaj zanke for, cilj pa ni omejen na sezname.

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

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

Če želite dobiti seznam elementov več iterabilnih objektov kot tuple, uporabite funkcijo list(), da ustvarite 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'>
Copied title and URL