Python, Korištenje funkcije zip(): Dohvaćanje elemenata više popisa odjednom

Poslovanje

Pythonova ugrađena funkcija zip() kombinira elemente višestrukih iterativnih objekata (liste, torke, itd.) i koristi se za dohvaćanje elemenata višestrukih popisa u for petlji.

Ovaj odjeljak opisuje sljedeću upotrebu funkcije zip().

  • Dobijte elemente više popisa u for petlji.
  • Rad s različitim brojem elemenata
    • zip():Funkcija će zanemariti elemente kojih je previše.
    • itertools.zip_longest():Ova funkcija će popuniti elemente koji nedostaju.
  • Dobiti popis torki elemenata višestrukih iterable.

Dobijte elemente više popisa u for petlji.

Ako želite dohvatiti i koristiti elemente višestrukih objekata koji se mogu ponavljati (liste, torke, itd.) u isto vrijeme u for petlji, navedite ih kao argumente funkciji 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, već i tri ili više.

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

Rad s različitim brojem elemenata

Funkcija zip() zanemaruje veliki broj elemenata.

U funkciji zip(), ako je broj elemenata na svakom popisu različit, bit će vraćen do manji (kraći) broj elemenata, a veći će se zanemariti.

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() popunit će elemente koji nedostaju.

Koristeći zip_longest() u modulu standardne biblioteke itertools, moguće je popuniti elemente koji nedostaju proizvoljnim vrijednostima kada je broj elemenata na svakom popisu različit.

Prema zadanim postavkama, ispunjen je s 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

Ako je argument fillvalue naveden, bit će ispunjen tom vrijednošću.

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

Čak i ako postoji više popisa s nedostajućim elementima, vrijednost koju treba ispuniti je ujednačena. Nije moguće odrediti različite vrijednosti.

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

Moguće je odrediti drugu vrijednost korištenjem zip_longest() unutar zip_longest(), ali to nije praktično jer morate unaprijed znati koji elementi popisa nedostaju.

Ako želite ispuniti više popisa s nepoznatim brojem elemenata, svaki s različitom vrijednošću, može se razmotriti sljedeći postupak.

  1. Definirajte vrijednosti koje treba ispuniti za sve popise.
  2. Dobijte maksimalan broj elemenata
  3. Ispunite sve liste na maksimalni broj elemenata
  4. Korištenje 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

U procesu popunjavanja do najvećeg broja elemenata radimo sljedeće.

  • Inicijaliziranje liste s proizvoljnom vrijednošću i brojem elemenata
  • + operator za spajanje popisa

Ako ovo pretvorimo u funkciju, to izgleda ovako. Izvorni popis i vrijednosti koje ispunjavaju popis specificirane su kao iterable (popis ili tuple) argumenti.

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

Koristi zapis za razumijevanje popisa i proširenje popisa za *.

Dobiti popis torki elemenata višestrukih iterable.

Funkcija zip() vraća iterator (zip objekt) koji je skup elemenata višestrukih objekata koji se mogu ponavljati.
Također se može koristiti izvan for petlje, a cilj nije ograničen na popise.

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

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

Ako želite dobiti popis elemenata višestrukih objekata koji se mogu ponavljati kao tuple, upotrijebite list() da napravite popis.

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