Python, Gebruik de zip() functie: De elementen van meerdere lijsten in één keer krijgen

Bedrijf

De ingebouwde functie zip() van Python combineert de elementen van meerdere iterabele objecten (lijsten, tupels, enz.) en wordt gebruikt om de elementen van meerdere lijsten in een for-lus op te halen.

Deze sectie beschrijft het volgende gebruik van de zip() functie.

  • Verkrijg de elementen van meerdere lijsten in een for-lus.
  • Omgaan met verschillend aantal elementen
    • zip():De functie zal de elementen die te veel zijn negeren.
    • itertools.zip_longest():Deze functie vult de ontbrekende elementen aan.
  • Verkrijg een lijst van tupels van elementen van meerdere iterabelen.

Verkrijg de elementen van meerdere lijsten in een for-lus.

Indien je de elementen van meerdere iterabele objecten (lijsten, tupels, enz.) tegelijkertijd wil opvragen en gebruiken in een for-lus, geef ze dan op als argumenten voor de zip()-functie.

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

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

Niet slechts twee, maar ook drie of meer.

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

Omgaan met verschillend aantal elementen

De zip() functie negeert een groot aantal elementen.

In de zip() functie zal, indien het aantal elementen in elke lijst verschillend is, het kleinste (kortere) aantal elementen teruggegeven worden, en het grootste aantal zal genegeerd worden.

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

De functie itertools.zip_longest() vult de ontbrekende elementen aan.

Met behulp van zip_longest() in de standaardbibliotheek itertools module is het mogelijk om de ontbrekende elementen op te vullen met willekeurige waarden wanneer het aantal elementen in elke lijst verschillend is.

Standaard is deze gevuld met Geen.

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

Indien het fillvalue argument is gespecificeerd, zal het met die waarde worden gevuld.

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

Zelfs als er meerdere lijsten zijn met ontbrekende elementen, is de op te vullen waarde uniform. Het is niet mogelijk om verschillende waarden op te geven.

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

Het is mogelijk om een andere waarde op te geven door zip_longest() binnen zip_longest() te gebruiken, maar dat is niet praktisch omdat je van tevoren moet weten welke elementen van de lijst ontbreken.

Indien men meerdere lijsten wil vullen met een onbekend aantal elementen, elk met een verschillende waarde, kan men de volgende procedure overwegen.

  1. Definieer waarden om te vullen voor alle lijsten.
  2. Verkrijg het maximum aantal elementen
  3. Vul alle lijsten tot het maximum aantal elementen
  4. Gebruik de zip() functie
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

Bij het vullen tot het grootste aantal elementen, doen we het volgende.

  • Een lijst initialiseren met een willekeurige waarde en een willekeurig aantal elementen
  • + operator om lijsten samen te voegen

Als we hier een functie van maken, ziet het er als volgt uit. De oorspronkelijke lijst en de waarden die de lijst vullen worden respectievelijk als iterables (lijst of tuple) argumenten opgegeven.

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

Het gebruikt lijstbegripnotatie en lijstuitbreiding met *.

Verkrijg een lijst van tupels van elementen van meerdere iterabelen.

De functie zip() geeft een iterator (zip-object) terug die een tupel is van elementen van meerdere iterabele objecten.
Het kan ook buiten de for-lus worden gebruikt, en het doel is niet beperkt tot lijsten.

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

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

Als je een lijst wilt krijgen van de elementen van meerdere iterabele objecten als een tupel, gebruik dan list() om een lijst te maken.

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