Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

3. Λίστες, εκφράσεις, τελεστές

ΤΜΧΠΠΑ-ΠΘ

Εισαγωγή στις λίστες

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

Παρακάτω δίνονται μερικά παραδείγματα από λίστες

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
colors = ["red", "green", "black", "blue"]
scores = [10, 8, 9, -2, 9]
myList = ["one", 2, 3.0]
languages=[['English'],['Gujarati'],['Hindi'],'Romanian','Spanish'] # εμφωλευμένη λίστα (nested list)
list_A = [] # άδεια λίστα

Οι λίστες είναι ταξινομημένες συλλογές δεδομένων. Η πρόσβαση στα στοιχεία της λίστας γίνεται μέσω του δείκτη ή της θέσης του κάθε στοιχείου. Το σημαντικό που πρέπει να συγκρατηθεί είναι ότι η αρίθμηση των στοιχείων σε μια λίστα ξεκινάει από το μηδεν. Το πρώτο στοιχείο έχει δείκτη 0, το δεύτερο 1 κ.ο.κ. Το τελευταίο στοιχείο στην λίστα έχει τον δείκτη -1, το δεύτερο στοιχείο από το τέλος τον δείκτη -2 κ.ο.κ. Δείτε στο παρακάτω παράδειγμα τι εκτυπώνεται με βάση την θέση που δηλώνουμε στην λιστα.

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])
print(bicycles[1])
print(bicycles[-1])
print(bicycles[1:3])
print(bicycles[1:3])
trek
cannondale
specialized
['cannondale', 'redline']
['cannondale', 'redline']

Παράδειγμα με εμφωλευμένη λίστα (nested list):

two_by_two = [[1, 2], [3, 4]]

print(two_by_two[0][1])
print(two_by_two[1][1])
2
4

Οι λίστες που περιέχουν συνεχόμενους ακέραιους αριθμούς μπορούν εύκολα να δημιουργηθούν ως εξής:

mylist = list(range(1,20))
print(mylist)

mylist1 = list(range(10))
print(mylist1)

mylist2 = list(range(1,20,4))
print(mylist2)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 5, 9, 13, 17]

Η μέθοδο index() μιας λίστας επιστρέφει το ευρετήριο (index) μιας τιμής:

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles.index('redline'))
2

Σε αντίθεση με τις συμβολοσειρές (strings) οι λίστες είναι μεταβαλλόμενες δομές δεδομένων. Αυτό σημαίνει ότι μπορoύμε να τροποποιήσουμε τα στοιχεία της λίστα, να προσθέσουμε νέα ή να αφαιρέσουμε.

Για παράδειγμα μπορούμε να τροποποιήσουμε τα στοιχεία μιας λίστας ως εξής:

colors=['caramel','gold','silver','occur']
colors[3]='bronze'
print(colors)
['caramel', 'gold', 'silver', 'bronze']
colors=['caramel','gold','silver','occur']
colors[2:]=['bronze','silver']
print(colors)
['caramel', 'gold', 'bronze', 'silver']
colors=['caramel','gold','silver','occur']
colors[2:3]=['bronze','silver']
print(colors)
['caramel', 'gold', 'bronze', 'silver', 'occur']

Μπορούμε να προσθέσουμε ένα στοιχείο σε μια λίστα με την μέθοδο append π.χ.

gods = ['Δίας', 'Ερμής', 'Ποσειδώνας', 'Ήφαιστος']
print("{} θεοί".format(len(gods)))
print(gods)


gods.append("Απόλλωνας")
gods.append("Άρης")
print("{} θεοί".format(len(gods)))
print(gods)
4 θεοί
['Δίας', 'Ερμής', 'Ποσειδώνας', 'Ήφαιστος']
6 θεοί
['Δίας', 'Ερμής', 'Ποσειδώνας', 'Ήφαιστος', 'Απόλλωνας', 'Άρης']

Αν επιθυμούμε να προσθέσουμε πολλά στοιχεία τότε χρησιμοποιείται η μέθοδος extend

months=["Ιανουάριος", "Φεβρουάριος", "Μάρτιος"]
months.extend(["Απρίλιος", "Μαϊος"]) # προσοχή το όρισμα στην μέθοδο extend είναι λίστα (ή κάποιο iterable object)

Μπορούμε να αφαιρέσουμε στοιχεία από μία λίστα με διάφορους τρόπους.

Με την πρόταση del:

Όταν γνωρίζουμε την θέση του στοιχείου που θέλουμε να αφαιρεθεί από μια λίστα χρησιμοποιούμαι την πρόταση del. Για παράδειγμα

gods = ['Δίας', 'Ερμής', 'Ποσειδώνας', 'Ήφαιστος']
del gods[2]
print(gods)
['Δίας', 'Ερμής', 'Ήφαιστος']

Το μήκος άλλαξε και μερικές από τις αντιστοιχίες στην λίστα. Πλέον ο θεός στην θέση 2 είναι :

print(gods[2])
Ήφαιστος

Με την μέθοδο pop:

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

cars=["Alfa Romeo", "Renault", "BMW", "Renault", "Porsche"]

print(cars)
['Alfa Romeo', 'Renault', 'BMW', 'Renault', 'Porsche']
speed_car=cars.pop()
print(speed_car)
Porsche
speed_car2=cars.pop(0)
print(speed_car2)
Alfa Romeo

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

Με την μέθοδο remove:

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

gods = ['Δίας', 'Ερμής', 'Ποσειδώνας', 'Ερμής', 'Ήφαιστος']

gods.remove("Ερμής")
print(gods)
['Δίας', 'Ποσειδώνας', 'Ερμής', 'Ήφαιστος']

Παράλληλα η Python προσφέρει μια συνοπτική μορφή για την δημιουργία λίστας από μία άλλη λίστα (list comprehension). Η μέθοδος αυτή χρησιμοποιεί τους βρόγχους (for loops) και τον έλεγχο ροής (if-else) προκειμένου να δημιουργήσει νέες λίστες και να μετασχηματίσει ή να φιλτράρει δεδομένα. Δίνονται μερικά παραδείγματα. Στο παρακάτω παράδειγμα μετατρέπουμε μια λίστα με πόλεις σε μια δεύτερη όπου αναγράφονται οι πόλεις με κεφαλαία:

cities = ['Volos', 'Larisa', 'Patra', 'Kalamatata']

cities_upper = [city.upper() for city in cities]
print(cities_upper)
['VOLOS', 'LARISA', 'PATRA', 'KALAMATATA']

Με τον επόμενο κώδικα υπολογίζουμε τα τετράγωνα για μια ακολουθία ακέραιων από το 0 ως το 20:

nums =range(0,21)
nums_sqr= [num**2  for num in nums]
print(nums_sqr)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

Στο ακόλουθο παράδειγμα γίνεται χρήση του έλεγχου ροής σε μία συνοπτική μορφή δημιουργίας λίστας. Από μία λίστα με αυτοκίνητα δημιουργούμε μία δεύτερη και κρατάμε όσα αρχίζουν με τον χαρακτήρα “A” από την πρώτη λίστα:

car_brands = [
    "Audi",
    "BMW",
    "Chevrolet",
    "Ford",
    "Honda",
    "Hyundai",
    "Kia",
    "Mercedes",
    "Nissan",
    "Alfa Romeo"
]

brands_starting_with_a = [brand for brand in car_brands if brand.startswith("A")]
print(brands_starting_with_a)
['Audi', 'Alfa Romeo']

Χρήσιμες μέθοδοι (methods) και συναρτήσεις (functions)

Μία από τις πλέον χρήσιμες μεθόδους της κλάσσης list είναι η ταξινόμηση (sort).

cars=[ "Porsche", "Alfa Romeo", "Renault", "BMW", "Audi" ]
cars.sort()
print(cars)
['Alfa Romeo', 'Audi', 'BMW', 'Porsche', 'Renault']

όπως φαίνεται η ταξινόμηση των στοιχείων της λίστας είναι μόνιμη. Ωστόσο αν θέλουμε προσωρινή ταξινόμηση τότε χρησιμοποιείται η function sorted.

cars=[ "Porsche", "Alfa Romeo", "Renault", "BMW", "Audi" ]
print(sorted(cars))
print(cars)
['Alfa Romeo', 'Audi', 'BMW', 'Porsche', 'Renault']
['Porsche', 'Alfa Romeo', 'Renault', 'BMW', 'Audi']

Όπως βλέπετε κατά την τελευταία εκτύπωση η λίστα διατηρεί την αρχική ταξινόμηση.

Επιπλέον με την μέθοδο reverse μπορούμε να αντιστρέψουμε την διάταξη των στοιχείων της λίστας. Και εδώ το αποτέλεσμα είναι μόνιμο.

cars=[ "Porsche", "Alfa Romeo", "Renault", "BMW", "Audi" ]

cars.reverse()
print(cars)
['Audi', 'BMW', 'Renault', 'Alfa Romeo', 'Porsche']

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

languages=['English','Gujarati', 'Hindi','Romanian','Spanish']
print(len(languages))
5

Εδώ πρέπει να δοθεί προσοχή. Γιατί ενώ η αρίθμηση των δεικτών ξεκινά από το 0 το μήκος της λίστας ξεκινά από το 1 για λίστα με ένα στοιχείο. Οπότε στο παρακάτω παράδειγμα θα λάβουμε σφάλμα εκτέλεσης αν πάμε να πάρουμε το 5ο και τελευταίο στοιχείο της λίστας. Γιατί αυτό ορίζεται με τον δείκτη 4 και όχι 5.

cars=[ "Porsche", "Alfa Romeo", "Renault", "BMW", "Audi" ]
print("Το μήκος της λίστας (πλήθος στοιχείων) είναι: ", len(cars))
print(cars[5])
Το μήκος της λίστας (πλήθος στοιχείων) είναι:  5
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[24], line 3
      1 cars=[ "Porsche", "Alfa Romeo", "Renault", "BMW", "Audi" ]
      2 print("Το μήκος της λίστας (πλήθος στοιχείων) είναι: ", len(cars))
----> 3 print(cars[5])

IndexError: list index out of range
list = ['physics', 'chemistry', 1997, 2000]
for item in list:
    print(item)
physics
chemistry
1997
2000
nisia = ["Μήλος", "Κρήτη", "Λέσβος"]
greek_islands = nisia

greek_islands.append("Κέρκυρα")

print(nisia)
['Μήλος', 'Κρήτη', 'Λέσβος', 'Κέρκυρα']

Όπως φαίνεται οι μεταβλητές nisia και greek_islands αντιστοιχούν στο ίδιο υποκείμενο object και αν μεταβάλλοντας τα στοιχεία της μίας μεταβλητής η αλλαγή αντικατοπτρίζεται και στα στοιχεία της δεύτερης.

Αυτό μπορούμε να το επιβεβαιώσουμε και με την χρήση των συναρτήσεων id και hex όπου επιστρέφονται οι ίδιες τιμές διεύθυνσης στην μνήμη:

print(hex(id(greek_islands)))
print(hex(id(nisia)))
0x7fe8e8a67e40
0x7fe8e8a67e40

Ο ενδεδειγμένος τρόπος για να αντιγράψουμε μια λίστα είναι να αντιγράψουμε όλα τα στοιχεία της ώστε να έχουμε δύο ανεξάρτητα objects (κλωνοποίηση).

nisia = ["Μήλος", "Κρήτη", "Λέσβος"]
greek_islands = nisia[:]

greek_islands.append("Κέρκυρα")

print(nisia)

print(greek_islands)
['Μήλος', 'Κρήτη', 'Λέσβος']
['Μήλος', 'Κρήτη', 'Λέσβος', 'Κέρκυρα']

Εκφράσεις και τελεστές

Μία έκφραση (expression) είναι ένας συνδυασμός από τιμές, μεταβλητές, τελεστές και κλήσεις σε συναρτήσεις. Οι τελεστές (operators) είναι λειτουργίες που κάνουν κάτι και μπορούν να αναπαρασταθούν με σύμβολα όπως το + ή με λέξεις κλειδιά όπως το and. Η αποτίμηση μιας έκφρασης παράγει μία τιμή και αυτός είναι και ο λόγος που μία έκφραση μπορεί να βρίσκεται στο δεξί μέρος μια εντολής εκχώρησης. Όταν μία μεταβλητή εμφανίζεται σε έκφραση, αντικαθίσταται από την τιμή της, προτού αποτιμηθεί η έκφραση Aγγελιδάκης (2015). Δεν απαιτείται μία έκφραση να περιέχει ταυτόχρονα και τιμές και μεταβλητές και τελεστές. Μία τιμή, όπως και μία μεταβλητή, από μόνες τους είναι επίσης εκφράσεις.

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

Αριθμητικοί τελεστές

ΤελεστήςΌνομαΠαράδειγμα
+Πρόσθεση αριθμών ή συνένωση συμβολοσειρώνx + y
-Αφαίρεσηx - y
*Πολλαπλασίασμός ή επανάληψη συμβολοσειράςx * y
/Διαίρεσηx / y
%Υπόλοιπο διαίρεσης δύο αριθμώνx % y
**Ύψωση αριθμού σε δύναμηx ** y
//Διαίρεση δύο αριθμών στρογγυλοποιημένη προς τα κάτωx // y

Τελεστές εκχώρησης

Χρησιμοποιούνται για να αποδώσουν τιμές σε μεταβλητές.

ΤελεστήςΠαράδειγμαΑντίστοιχο με
=x = 5x = 5
+=x += 3x = x + 3
-=x -= 3x = x - 3
*=x *= 3x = x * 3
/=x /= 3x = x / 3
%=x %= 3x = x % 3
//=x //= 3x = x // 3
**=x **= 3x = x ** 3
&=x &= 3x = x & 3
|=x |= 3x = x | 3
^=x ^= 3x = x ^ 3
>>=x >>= 3x = x >> 3
<<=x <<= 3x = x << 3

Τελεστές σύγκρισης

Χρησιμοποιούνται για την σύγκριση 2 τιμών

ΤελεστήςΣύγκρισηΠαράδειγμα
==Ίσονx == y
!=Διαφορετικόx != y
>Μεγαλύτερο απόx > y
<Μικρότερο απόx < y
>=Μεγαλύτερο ή ίσον απόx >= y
<=Μικρότερο ή ίσον απόx <= y

Λογικοί τελεστές

ΤελεστήςΠεριγραφήΠαράδειγμα
andΕπιστρέφει Αληθές (True) αν και οι δύο προτάσεις είναι αληθείςx < 5 and x < 10
orΕπιστρέφει Αληθές (True) αν έστω μία από τις προτάσεις είναι αληθήx < 5 or x < 4
notΑντιστροφή απότελέσματος, επιστρέφει Μη Αληθές όταν το αποτέλεσμα είναι αληθέςnot(x < 5 and x < 10)

Εκτός από τους παραπάνω τελεστές υπάρχουν πιο εξειδικεύμενοι τελεστές που δεν θα αναφερθούμε (Bitwise, Membership, Identity operators).

Οι τελεστές στη Python τηρούν την αντίστοιχη προτεραιότητα που χρησιμοποιείται και στα μαθηματικά.

Οι παρενθέσεις έχουν τη μεγαλύτερη προτεραιότητα. Πολλαπλασιασμός και διαίρεση έχουν υψηλότερα προτεταιότητα από την πρόσθεση και αφαίρεση.

Τελεστές με την ίδια προτεραιότητα αποτιμώνται από τα αριστερά προς τα δεξιά.

References
  1. Aγγελιδάκης, Ν. (2015). Εισαγωγή στον προγραμματισμό με την Python. Αγγελιδάκης.