PYTHON ΕΝΟΤΗΤΑ 14 – List Comprehension

 



ΕΙΣΑΓΩΓΗ

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

ΤΙ ΕΙΝΑΙ ΤΟ LIST COMPREHENSION?

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

app.py

my_list = []
for x in range(1, 11):
    my_list.append(x * 5)

print(my_list)

Output

[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

Πρώτα λοιπόν εκτελούμε ένα for loop το οποίο, για κάθε τιμή που υπάρχει μέσα στο εύρος αριθμών του range( ), θα πολλαπλασιάζει το κάθε element με το 5 και θα προσθέτει την τιμή στο list. Εκτελώντας το print( ) βλέπουμε όλες τις τελικές τιμές που έχουμε αποθηκεύσει στο list.

Σε αυτό το απλό παράδειγμα, χρειάστηκαν 2 γραμμές κώδικα για να δημιουργήσουμε την λογική που θέλουμε να εκτελέσει το πρόγραμμα μας. Σε άλλες περιπτώσεις αυτή η λογική μπορεί να είναι περισσότερες από δύο γραμμές κώδικα. Τι είναι λοιπόν ένα list comprehension? Το list comprehension είναι ο τρόπος που μας προσφέρει η Python να μπορούμε να γεμίζουμε με δεδομένα ένα list γράφοντας μόνο μια γραμμή κώδικα.

Μπορούμε λοιπόν να αντικαταστήσουμε τις γραμμές κώδικα του ορισμού του άδειου list, του for loop και του append( ) method με μόνο μια γραμμή. Ενώ ο χρόνος εκτέλεσης του προγράμματος θα παραμένει ο ίδιος, σίγουρα ο κώδικας σας θα είναι λιγότερος και περισσότερο οργανωμένος. Πως λοιπόν συντάσσουμε ένα list comprehension?

ΠΩΣ ΣΥΝΤΑΣΣΟΥΜΕ ΕΝΑ LIST COMPREHENSION

Για να εξηγήσουμε πως ακριβώς συντάσσουμε ένα list comprehension ας δούμε πρώτα πως θα μπορούσαμε να βελτιώσουμε το προηγούμενο παράδειγμα γράφοντας το σαν list comprehension.

app.py

my_list = [x * 5 for x in range(1, 11)]
print(my_list)

Output

[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

Ο γενικός τρόπος σύνταξης ενός list comprehension είναι ο εξής:

result = [ transform  iteration   filter ]

Εμείς στο προηγούμενο παράδειγμα δημιουργήσαμε ένα iteration (που είναι το for loop) το οποίο για κάθε τιμή του range( ) θα εκτελεστεί το transform το οποίο για εμάς είναι x*5. Τα list comprehensions δηλώνονται μέσα σε square brackets ( [ ] ).

LIST COMPREHENSION WITH IF-ELSE STATEMENTS

Με βάση το γενικό ορισμό του list comprehension μπορούμε να προσθέσουμε και filters δηλαδή if-statements που φιλτράρουν τις τιμές πριν τις αναθέσουμε στο τελικό list. Ας δούμε πως υλοποιείται ένα τέτοιο απλό παράδειγμα.

app.py

my_list = [x * 5 for x in range(1, 11) if x % 2 == 0]
print(my_list)

Output

[10, 20, 30, 40, 50]

Για κάθε τιμή του x που ανήκει μέσα στο εύρος τιμών του range( ), κάνουμε πρώτα έναν έλεγχο αν είναι ζυγός αριθμός. Αν ναι, τότε δίνουμε την τιμή να εκτελεστεί από το transform σκέλος της εντολή που στο δικό μας παράδειγμα δεν κάνει τίποτα απλά δέχεται την τιμή.

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

app.py

my_list = ["Even" if x % 2 == 0 else "Odd" for x in range(1, 11)]
print(my_list)

Output

['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']

Ας δημιουργήσουμε ένα ακόμα παράδειγμα όπου έχουμε δύο lists που περιέχουν ποδοσφαιρικές ομάδες. Θέλουμε να βρούμε ποιες ομάδες είναι κοινές και στα δύο list.

app.py

teama = ['Arsenal', 'Burnley', 'Everton', 'Aston Villa']
teamb = ['Chelsea', 'Arsenal', 'Liverpool', 'Everton']

common_teams = [i for i in teama if i in teamb]
print(common_teams)

Output

['Arsenal', 'Everton']

Τα list comprehensions δεν εφαρμόζονται μόνο σε list αλλά και σε dictionaries. Για αυτά όμως θα μιλήσουμε στην επόμενη ενότητα.

Μην ξεχάσετε να κάνετε ένα μικρό donationέτσι ώστε αυτό το siteνα μεγαλώσει ακόμα πιο πολύ και να αποκτήσει περισσότερες δυνατότητες onlineπαράδοσης δωρεάν μαθημάτων.

full-width

Post a Comment

0 Comments