Python, Användning av funktionen zip(): Hämta elementen i flera listor på en gång

Företag

Pythons inbyggda funktion zip() kombinerar elementen i flera iterbara objekt (listor, tupler osv.) och används för att hämta elementen i flera listor i en for-slinga.

I det här avsnittet beskrivs följande användning av funktionen zip().

  • Hämta elementen i flera listor i en for-slinga.
  • Hantering av olika antal element
    • zip():Funktionen ignorerar de element som är för stora.
    • itertools.zip_longest():Den här funktionen fyller i de element som saknas.
  • Hämta en lista med tupler av element i flera iterables.

Hämta elementen i flera listor i en for-slinga.

Om du vill hämta och använda elementen i flera iterabla objekt (listor, tuplar etc.) samtidigt i en for-slinga anger du dem som argument till funktionen 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

Inte bara två, utan även tre eller fler.

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

Hantering av olika antal element

Funktionen zip() ignorerar ett stort antal element.

I funktionen zip(), om antalet element i varje lista är olika, returneras upp till det mindre (kortare) antalet element och det större antalet ignoreras.

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

Funktionen itertools.zip_longest() fyller i de element som saknas.

Med hjälp av zip_longest() i modulen itertools i standardbiblioteket är det möjligt att fylla i de element som saknas med godtyckliga värden när antalet element i varje lista är olika.

Som standard är den fylld med 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

Om argumentet fillvalue anges fylls den med det värdet.

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

Även om det finns flera listor med saknade element är det värde som ska fyllas i enhetligt. Det är inte möjligt att ange olika värden.

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

Det är möjligt att ange ett annat värde genom att använda zip_longest() inuti zip_longest(), men det är inte praktiskt eftersom du måste veta i förväg vilka element i listan som saknas.

Om du vill fylla flera listor med ett okänt antal element, var och en med ett annat värde, kan du använda följande förfarande.

  1. Definiera värden som ska fyllas i för alla listor.
  2. Få fram det maximala antalet element
  3. Fyll alla listor med maximalt antal element.
  4. Användning av funktionen 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

För att fylla upp det största antalet element gör vi följande.

  • Initiera en lista med ett godtyckligt värde och antal element
  • + för att sammanfoga listor

Om vi omvandlar detta till en funktion ser det ut så här. Den ursprungliga listan och de värden som fyller listan anges som argument för iterables (lista eller tupel).

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

Den använder listförståelse och listutvidgning med *.

Hämta en lista med tupler av element i flera iterables.

Funktionen zip() returnerar en iterator (zip-objekt) som är en tupel av element från flera iterabla objekt.
Den kan också användas utanför for-slingan, och målet är inte begränsat till listor.

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

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

Om du vill få en lista över elementen i flera iterabla objekt som en tupel använder du list() för att skapa en lista.

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