Python, Utilizarea funcției zip(): Obținerea simultană a elementelor din mai multe liste

Afaceri

Funcția încorporată în Python zip() combină elementele mai multor obiecte iterabile (liste, tuple, etc.) și este utilizată pentru a prelua elementele mai multor liste într-o buclă for.

Această secțiune descrie următoarea utilizare a funcției zip().

  • Obțineți elementele din mai multe liste într-o buclă for.
  • Tratarea cu un număr diferit de elemente
    • zip():Funcția va ignora elementele care sunt prea mari.
    • itertools.zip_longest():Această funcție va completa elementele lipsă.
  • Obține o listă de tușe de elemente din mai multe iterabile.

Obțineți elementele din mai multe liste într-o buclă for.

Dacă doriți să preluați și să utilizați elementele mai multor obiecte iterabile (liste, tuple etc.) în același timp într-o buclă for, specificați-le ca argumente pentru funcția 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

Nu doar două, ci și trei sau mai multe.

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

Tratarea cu un număr diferit de elemente

Funcția zip() ignoră un număr mare de elemente.

În funcția zip(), în cazul în care numărul de elemente din fiecare listă este diferit, se va returna până la numărul mai mic (mai scurt) de elemente, iar numărul mai mare va fi ignorat.

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

Funcția itertools.zip_longest() va completa elementele lipsă.

Folosind zip_longest() din modulul itertools al bibliotecii standard, este posibil să se completeze elementele lipsă cu valori arbitrare atunci când numărul de elemente din fiecare listă este diferit.

În mod implicit, acesta este completat cu 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

Dacă este specificat argumentul fillvalue, acesta va fi completat cu valoarea respectivă.

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

Chiar dacă există mai multe liste cu elemente lipsă, valoarea care trebuie completată este uniformă. Nu este posibil să se specifice valori diferite.

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

Este posibil să se precizeze o valoare diferită folosind zip_longest() în interiorul zip_longest(), dar acest lucru nu este practic, deoarece trebuie să știți dinainte ce elemente din listă lipsesc.

Dacă doriți să completați mai multe liste cu un număr necunoscut de elemente, fiecare cu o valoare diferită, se poate lua în considerare următoarea procedură.

  1. Definiți valorile de completat pentru toate listele.
  2. Obține numărul maxim de elemente
  3. Umpleți toate listele până la numărul maxim de elemente
  4. Utilizarea funcției 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

În procesul de umplere până la cel mai mare număr de elemente, se procedează în felul următor.

  • Inițializarea unei liste cu o valoare și un număr arbitrar de elemente
  • Operatorul + pentru a uni listele

Dacă transformăm acest lucru într-o funcție, arată astfel. Lista originală și valorile care umplu lista sunt specificate ca argumente iterabile (listă sau tuple), respectiv.

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

Se utilizează notația de înțelegere a listei și extinderea listei prin *.

Obține o listă de tușe de elemente din mai multe iterabile.

Funcția zip() returnează un iterator (obiect zip) care este un tandem de elemente din mai multe obiecte iterabile.
Poate fi utilizat și în afara buclei for, iar ținta nu se limitează la liste.

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

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

Dacă doriți să obțineți o listă a elementelor mai multor obiecte iterabile sub formă de tuple, utilizați list() pentru a crea o listă.

l = list(zip(names, ages))
print(l)
print(type(l))
print(type(l[0]))
# [('Alice', 24), ('Bob', 50), ('Charlie', 18)]
# <class 'list'>
# <class 'tuple'>