Για να δημιουργήσετε μια νέα λίστα στην Python εξάγοντας ή διαγράφοντας μόνο εκείνα τα στοιχεία μιας υπάρχουσας λίστας (πίνακα) που ικανοποιούν ορισμένες συνθήκες, ή εκτελώντας αντικαταστάσεις ή μετατροπές, χρησιμοποιήστε την κατανόηση λίστας.
Τα παρακάτω εξηγούνται εδώ, μαζί με δείγμα κώδικα.
- Βασική μορφή συμβολισμού κατανόησης λίστας
- Εφαρμόστε τη διαδικασία σε όλα τα στοιχεία της λίστας
- Εξαγωγή και διαγραφή στοιχείων από τη λίστα που πληρούν τα κριτήρια
- Αντικατάσταση ή μετατροπή στοιχείων που ικανοποιούν τους όρους της λίστας
Δείτε το ακόλουθο άρθρο για συγκεκριμένα παραδείγματα λιστών συμβολοσειρών.
Είναι επίσης δυνατή η τυχαία εξαγωγή στοιχείων που δεν πληρούν τα κριτήρια.
Σημειώστε ότι οι λίστες μπορούν να αποθηκεύουν διαφορετικούς τύπους δεδομένων και διαφέρουν αυστηρά από τους πίνακες. Αν θέλετε να χειρίζεστε πίνακες σε διαδικασίες που απαιτούν μέγεθος μνήμης και διευθύνσεις μνήμης ή αριθμητική επεξεργασία μεγάλων δεδομένων, χρησιμοποιήστε array (standard library) ή NumPy.
Ο ακόλουθος κατάλογος είναι ένα παράδειγμα
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Βασική μορφή συμβολισμού κατανόησης λίστας
Κατά τη δημιουργία μιας νέας λίστας από μια λίστα, η κατανόηση λίστας είναι απλούστερη στη σύνταξη από ό,τι οι βρόχοι for.
[expression for any variable name in iterable object if conditional expression]
Μια έκφραση εφαρμόζεται σε ένα στοιχείο που ικανοποιεί την υπό συνθήκη έκφραση ενός επαναλήψιμου αντικειμένου (όπως μια λίστα ή μια πλειάδα) και γίνεται στοιχείο μιας νέας λίστας. Το «if conditional expression» μπορεί να παραλειφθεί, οπότε η έκφραση εφαρμόζεται σε όλα τα στοιχεία.
Ανατρέξτε στο ακόλουθο άρθρο για περισσότερες λεπτομέρειες, συμπεριλαμβανομένου του συμβολισμού κατανόησης φωλιασμένης λίστας.
Εφαρμόστε τη διαδικασία σε όλα τα στοιχεία της λίστας
Για παράδειγμα, αν θέλετε να εφαρμόσετε κάποια επεξεργασία σε όλα τα στοιχεία μιας λίστας, περιγράψτε την επιθυμητή επεξεργασία στην παραπάνω έκφραση κατανόησης λίστας.
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
Αυτό μπορεί να χρησιμοποιηθεί για τη μετατροπή μεταξύ λιστών αριθμών και λιστών συμβολοσειρών.
Εξαγωγή και διαγραφή στοιχείων από τη λίστα που πληρούν τα κριτήρια
Εάν το στοιχείο πρόκειται να επιλεγεί μόνο από μια υπό συνθήκη έκφραση, δεν επεξεργάζεται από μια έκφραση, οπότε παίρνει την ακόλουθη μορφή
[variable name for variable name in original list if conditional expression]
Δημιουργείται μια νέα λίστα από την οποία εξάγονται μόνο τα στοιχεία που ικανοποιούν τη συνθήκη (στοιχεία για τα οποία η υπό συνθήκη έκφραση είναι αληθής).
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
Εάν η «if conditional expression» οριστεί σε «if not conditional expression», μετατρέπεται σε άρνηση και μόνο τα στοιχεία που δεν ικανοποιούν τη συνθήκη (στοιχεία για τα οποία η υπό συνθήκη έκφραση είναι ψευδής) μπορούν να επιλεγούν και να εξαχθούν. Με άλλα λόγια, δημιουργείται μια νέα λίστα από την οποία αφαιρούνται τα στοιχεία που ικανοποιούν τη συνθήκη.
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Φυσικά, το ίδιο αποτέλεσμα επιτυγχάνεται με τον προσδιορισμό της ισοδύναμης υπό συνθήκη έκφρασης χωρίς τη χρήση του not.
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Το μέρος της υπό συνθήκη έκφρασης μπορεί να είναι πολλαπλές συνθήκες. Μπορούν επίσης να χρησιμοποιηθούν αρνητικά nots.
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
Αντικατάσταση ή μετατροπή στοιχείων που ικανοποιούν τους όρους της λίστας
Στο παραπάνω παράδειγμα εξαγωγής στοιχείων, αφαιρέθηκαν τα στοιχεία που δεν ικανοποιούσαν τις προϋποθέσεις.
Αν θέλετε να εκτελέσετε αντικαταστάσεις, μετατροπές κ.λπ. μόνο στα στοιχεία που ικανοποιούν τις συνθήκες, εφαρμόστε τον τελεστή ternary στο τμήμα έκφρασης του συμβολισμού κατανόησης λίστας.
Στην Python, ο τελεστής ternary μπορεί να γραφτεί ως εξής
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
Είναι λίγο περίπλοκο, αλλά ο συνδυασμός του συμβολισμού της κατανόησης λίστας και των τριμερών τελεστών έχει ως εξής.
[True Value if Conditional Expression else False Value for any variable name in original list]
Το μέρος που περικλείεται σε παρενθέσεις είναι ο τριμερής τελεστής (οι παρενθέσεις δεν είναι απαραίτητες στον πραγματικό κώδικα).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Εάν οποιοδήποτε όνομα μεταβλητής γράφεται ως έχει για αληθείς ή ψευδείς τιμές, η τιμή του αρχικού στοιχείου χρησιμοποιείται ως έχει. Εάν γράφεται μια έκφραση, εφαρμόζεται η επεξεργασία αυτής της έκφρασης.
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]