Αποσυσκευασία (επέκταση και ανάθεση σε πολλαπλές μεταβλητές) πλειάδων και λιστών στην Python

Επιχείρηση

Στην Python, τα στοιχεία μιας πλειάδας ή μιας λίστας μπορούν να επεκταθούν και να ανατεθούν σε πολλαπλές μεταβλητές. Αυτό ονομάζεται αποσυμπίεση ακολουθίας ή αποσυμπιεσμένη ανάθεση.

Εδώ περιγράφονται οι ακόλουθες λεπτομέρειες.

  • Βασικά στοιχεία αποσυμπίεσης πλειάδων και λιστών
  • Φωλιασμένες πλειάδες, αποσυσκευασμένες λίστες
  • Αποσυσκευασία με υπογράμμιση:_
  • Αποσυσκευασία με αστερίσκους:*

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

Βασικά στοιχεία αποσυμπίεσης πλειάδων και λιστών

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

t = (0, 1, 2)

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# 2

l = [0, 1, 2]

a, b, c = l

print(a)
print(b)
print(c)
# 0
# 1
# 2

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

a, b = 0, 1

print(a)
print(b)
# 0
# 1

Εάν ο αριθμός των μεταβλητών δεν συμφωνεί με τον αριθμό των στοιχείων, εμφανίζεται σφάλμα.

# a, b = t
# ValueError: too many values to unpack (expected 2)

# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)

Εάν ο αριθμός των μεταβλητών είναι μικρότερος από τον αριθμό των στοιχείων, τα υπόλοιπα στοιχεία μπορούν να εκχωρηθούν ως λίστα με την προσθήκη ενός αστερίσκου στο όνομα της μεταβλητής (βλ. παρακάτω).

Φωλιασμένες πλειάδες, αποσυσκευασμένες λίστες

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

  • ()
  • []
t = (0, 1, (2, 3, 4))

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)

print(type(c))
# <class 'tuple'>

a, b, (c, d, e) = t

print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4

Αποσυσκευασμένο με _underscore_.

Στην Python, όχι μόνο αποσυμπιεσμένες, οι τιμές που δεν χρειάζονται εκχωρούνται συμβατικά στην υπογράμμιση (underscore) _. Δεν υπάρχει κάποια ιδιαίτερη γραμματική σημασία, απλώς εκχωρούνται σε μια μεταβλητή με το όνομα _.

t = (0, 1, 2)

a, b, _ = t

print(a)
print(b)
print(_)
# 0
# 1
# 2

Αποσυσκευασία με αστερίσκους

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

Αυτή η σύνταξη εφαρμόζεται από την Python 3 και δεν είναι διαθέσιμη στην Python 2.

Τα στοιχεία εκχωρούνται από την αρχή και το τέλος στις μεταβλητές χωρίς αστερίσκους και τα υπόλοιπα στοιχεία εκχωρούνται ως λίστα στις μεταβλητές με αστερίσκους.

t = (0, 1, 2, 3, 4)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]

print(type(c))
# <class 'list'>

a, *b, c = t

print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4

*a, b, c = t

print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4

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

a, b, *_ = t

print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]

Το ίδιο μπορεί επίσης να γραφτεί ως εξής

a, b = t[0], t[1]

print(a)
print(b)
# 0
# 1

Μόνο ένας αστερίσκος μπορεί να επισυναφθεί. Εάν υπάρχουν πολλαπλές μεταβλητές που σημειώνονται με αστερίσκο, θα προκύψει σφάλμα SyntaxError, επειδή δεν είναι δυνατόν να προσδιοριστεί πόσα στοιχεία αντιστοιχούν σε κάθε μεταβλητή.

# *a, b, *c = t
# SyntaxError: two starred expressions in assignment

Σημειώστε ότι ακόμη και ένα μεμονωμένο στοιχείο που εκχωρείται σε μια μεταβλητή με αστερίσκο εκχωρείται ως λίστα.

t = (0, 1, 2)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2]

print(type(c))
# <class 'list'>

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

a, b, c, *d = t

print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []