Python, Χρήση της συνάρτησης zip(): Λήψη των στοιχείων πολλαπλών λιστών ταυτόχρονα

Επιχείρηση

Η ενσωματωμένη συνάρτηση zip() της Python συνδυάζει τα στοιχεία πολλαπλών αντικειμένων επανάληψης (λίστες, πλειάδες κ.λπ.) και χρησιμοποιείται για την ανάκτηση των στοιχείων πολλαπλών λιστών σε έναν βρόχο for.

Αυτή η ενότητα περιγράφει την ακόλουθη χρήση της συνάρτησης zip().

  • Λήψη των στοιχείων πολλαπλών λιστών σε έναν βρόχο for.
  • Αντιμετώπιση διαφορετικού αριθμού στοιχείων
    • zip():Η συνάρτηση θα αγνοήσει τα στοιχεία που είναι υπερβολικά πολλά.
    • itertools.zip_longest():Αυτή η συνάρτηση θα συμπληρώσει τα στοιχεία που λείπουν.
  • Λήψη μιας λίστας από πλειάδες στοιχείων πολλαπλών iterables.

Λήψη των στοιχείων πολλαπλών λιστών σε έναν βρόχο for.

Αν θέλετε να ανακτήσετε και να χρησιμοποιήσετε τα στοιχεία πολλαπλών αντικειμένων επανάληψης (λίστες, πλειάδες κ.λπ.) ταυτόχρονα σε έναν βρόχο for, καθορίστε τα ως ορίσματα στη συνάρτηση 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

Όχι μόνο δύο, αλλά και τρία ή και περισσότερα.

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

Αντιμετώπιση διαφορετικού αριθμού στοιχείων

Η συνάρτηση zip() αγνοεί μεγάλο αριθμό στοιχείων.

Στη συνάρτηση zip(), εάν ο αριθμός των στοιχείων σε κάθε λίστα είναι διαφορετικός, θα επιστραφεί ο μικρότερος (μικρότερος) αριθμός στοιχείων και ο μεγαλύτερος αριθμός θα αγνοηθεί.

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() θα συμπληρώσει τα στοιχεία που λείπουν.

Χρησιμοποιώντας την zip_longest() στην ενότητα itertools της τυπικής βιβλιοθήκης, είναι δυνατό να συμπληρώσετε τα στοιχεία που λείπουν με αυθαίρετες τιμές όταν ο αριθμός των στοιχείων σε κάθε λίστα είναι διαφορετικός.

Από προεπιλογή, συμπληρώνεται με το 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

Εάν έχει καθοριστεί το όρισμα fillvalue, θα συμπληρωθεί με αυτή την τιμή.

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

Ακόμη και αν υπάρχουν πολλαπλές λίστες με ελλείποντα στοιχεία, η τιμή που πρέπει να συμπληρωθεί είναι ενιαία. Δεν είναι δυνατόν να καθοριστούν διαφορετικές τιμές.

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

Είναι δυνατόν να καθορίσετε μια διαφορετική τιμή χρησιμοποιώντας τη zip_longest() μέσα στη zip_longest(), αλλά αυτό δεν είναι πρακτικό, επειδή πρέπει να γνωρίζετε εκ των προτέρων ποια στοιχεία της λίστας λείπουν.

Αν θέλετε να συμπληρώσετε πολλαπλές λίστες με άγνωστο αριθμό στοιχείων, το καθένα με διαφορετική τιμή, μπορείτε να εξετάσετε την ακόλουθη διαδικασία.

  1. Καθορίστε τις τιμές που πρέπει να συμπληρωθούν για όλες τις λίστες.
  2. Λήψη του μέγιστου αριθμού στοιχείων
  3. Συμπληρώστε όλες τις λίστες στο μέγιστο αριθμό στοιχείων
  4. Χρήση της συνάρτησης 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

Κατά τη διαδικασία συμπλήρωσης του μεγαλύτερου αριθμού στοιχείων, κάνουμε τα εξής.

  • Αρχικοποίηση μιας λίστας με μια αυθαίρετη τιμή και αριθμό στοιχείων
  • Συντελεστής + για την ένωση λιστών

Αν το μετατρέψουμε αυτό σε συνάρτηση, μοιάζει ως εξής. Η αρχική λίστα και οι τιμές που γεμίζουν τη λίστα καθορίζονται ως ορίσματα iterables (λίστα ή πλειάδα), αντίστοιχα.

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

Χρησιμοποιεί συμβολισμό κατανόησης λίστας και επέκταση λίστας με *.

Λήψη μιας λίστας από πλειάδες στοιχείων πολλαπλών iterables.

Η συνάρτηση zip() επιστρέφει έναν επαναλήπτη (αντικείμενο zip) που είναι μια πλειάδα στοιχείων πολλαπλών επαναλήψιμων αντικειμένων.
Μπορεί επίσης να χρησιμοποιηθεί εκτός του βρόχου for και ο στόχος δεν περιορίζεται σε λίστες.

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

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

Αν θέλετε να λάβετε μια λίστα με τα στοιχεία πολλαπλών επαναληπτικών αντικειμένων ως πλειάδα, χρησιμοποιήστε την 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'>