Skip to content

zip() in Python: Elemente aus mehreren Listen holen

Python

In Python aggregiert die eingebaute Funktion zip() mehrere iterierbare Objekte (Listen, Tupel usw.). Sie können mehrere Listen in der For-Schleife mit zip() durchlaufen.

Dieser Artikel hat folgenden Inhalt.

  • Iterieren Sie zwei, drei oder mehr Listen mit zip()
  • Für den Fall, dass die Anzahl der Elemente unterschiedlich ist
    • zip() ignoriert die zusätzlichen Elemente
    • itertools.zip_longest() füllt die fehlenden Elemente aus
  • Rufen Sie eine Liste mit mehreren iterierbaren Elementen ab

Iterieren Sie zwei, drei oder mehr Listen mit zip()

Indem Sie zwei Listen an zip() übergeben, can Sie you in the for-Schleife iterieren.

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

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

Gleiches gilt nicht nur für zwei Listen, sondern auch für drei oder mehr Listen.

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

Sie können andere iterierbare Objekte sowie Listen angeben.

Für den Fall, dass die Anzahl der Elemente unterschiedlich ist

Wenn die Anzahl der Elemente jedes iterierbaren Objekts unterschiedlich ist, ignoriert zip() die zusätzlichen Elemente.

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

itertools.zip_longest() füllt die fehlenden Elemente aus

Mit itertools.zip_longest() can SIE sterben fehlenden Elemente mit irgendwelchen Werten füllen.

Standardmäßig ist es mit None gefüllt.

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

Sie können den zu füllenden Wert im Parameter fillvalue angeben.

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

Der zu füllende Wert ist einheitlich, auch wenn mehrere Listen mit unzureichenden Elementen vorhanden sind. Sie können keine anderen Werte angeben.

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

Wenn SIE mehrere Listen mit unbekannter Anzahl von Elementen mit unterschiedlichen Werten füllen möchten, gehen Sie wie folgt vor.

  1. Definieren Sie den Wert, der für alle Listen ausgefüllt werden soll
  2. Holen Sie sich die maximale Anzahl von Elementen
  3. Füllen Sie alle Listen bis zur maximalen Anzahl von Elementen
  4. Mit zip() aggregieren
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

Der Vorgang des Füllens der Liste mit der maximalen Anzahl von Elementen used sterben Initialisierung and Verkettung of Listen.

Es kann eine Funktion wie diese sein:

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

Es verwendet List Comprehensions und List Unpacking by *.

Rufen Sie eine Liste mit mehreren iterierbaren Elementen ab

zip gibt einen Iterator (Zip-Objekt) zurück, der ein Tupel mit den mehreren Elementen iterierbarer Objekte enthält.

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

z = zip(names, ages)
print(z)
print(type(z))
# 
# <class 'zip'>

Sie können mit list() in eine Liste umgewandelt werden.

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