14. Λίστες

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

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

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

Παράδειγμα

>>> list1 = [150, 'b', 'blue', 'Volos', 86]
>>> print(list1)
[150, 'b', 'blue', 'Volos', 86]
>>> print(list1[0])
150
>>> print(list1[2])
blue
>>> print(list1[4])
86

Στο προηγούμενο απόσπασμα κώδικα ορίσαμε μια λίστα την list1 με πέντε στοιχεία, το πρώτο στοιχείο είναι το list[0] ενώ το τελευταίο είναι το list[4], έτσι με αυτό τον τρόπο η πρόσβαση στα στοιχεία μιας λίστας γίνεται με χρήση δείκτη. Ο δείκτης μπορεί να είναι μια παράσταση η οποία αποτιμάται σε ακέραια τιμή. Οι τιμές του δείκτη μιας λίστας θα πρέπει να είναι εντός των τιμών δείκτη της λίστας.

Με την συνάρτηση len(όνομα_λίστας) παίρνουμε τον αριθμό των στοιχείων μιας λίστας. Ακολουθεί ένα παράδειγμα:

>>> list2 = [78, 'red', 'Trikala', 100, 200]
>>> print(len(list2))
5
>>> print(list2[len(list2)-1])
200

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

Μπορούμε να χρησιμοποιήσουμε αρνητικούς δείκτες, οι οποίοι μετράνε από το τέλος της λίστας προς την αρχή. Έτσι ο δείκτης -1 αντιπροσωπεύει το τελευταίο στοιχείο της λίστας, ο -2 το προτελευταίο κ.τ.λ. , ενώ ο δείκτης –len(list2) αντιπροσωπεύει το πρώτο στοιχείο της λίστας list1. Δίνουμε ένα παράδειγμα:

>>> list2 = [78, 'red', 'Trikala', 100, 200]
>>> list2[-1]
200
>>> list2[-2]
100
>>> list2[-4]
red
>>> list2[-len(list2)]
78

Ο λογικός τελεστής in

Με τον λογικό τελεστή in ελέγχουμε εάν μια τιμή ανήκει σε μια λίστα. Επιστρέφει το λογικό True αν η τιμή υπάρχει μέσα σε μια λίστα και το λογικό False αν δεν υπάρχει. Ο τελεστής in όπως έχουμε δει σε προηγούμενη ενότητα δουλεύει και στις συμβολοσειρές. Ανάλογα ορίζεται και ο λογικός τελεστής not in Ακολουθεί ένα παράδειγμα:

>>> cars = ['Toyota', 'Nissan', 'Ford', 'Mini']
>>> 'Nissan' in cars
True
>>> 'Mercedes' in cars
False
>>> 'Mercedes' not in cars
True

Διάσχιση λίστας

Όταν θέλουμε να παίρνουμε διαδοχικά ένα – ένα τα στοιχεία μιας λίστας, μπορούμε να το κάνουμε με τη χρήση της εντολής while. Ακολουθεί ένα παράδειγμα:

>>> lista3 = [47, 'c', 'Fiat', 'd', 250]
>>> index = 0
>>> while  index<len(lista3):
             print(lista3[index])
             index+=1

Σε αυτό το απόσπασμα κώδικα ο βρόγχος while παίρνει ένα – ένα τα στοιχεία της λίστας ξεκινώντας από το πρώτο στοιχείο το οποίο το εκτυπώνει με την εντολή print. Έχουμε πρόσβαση σε κάθε στοιχείο της λίστας με την κατάλληλη τιμή του δείκτη index. Ο βρόγχος τερματίζεται όταν ο δείκτης παίρνει τιμή ίση με το μέγεθος της λίστας. Η έξοδος του παραπάνω αποσπάσματος κώδικα είναι:

47
c
Fiat
d
250

Ένας άλλος ισοδύναμος τρόπος για να διαχειριστούμε μια λίστα είναι με τη χρήση της εντολής for. Ακολουθεί ένα παράδειγμα:

>>> lista3 = [47, 'c', 'Fiat', 'd', 250]
>>> for m in list3:
               print(m)

Εδώ με τη χρήση του βρόγχου for η μεταβλητή m παίρνει στη σειρά ένα – ένα στοιχείο της λίστας και το τυπώνει. Αυτή η διαδικασία (βρόγχος) τερματίζεται όταν «εξαντληθούν» όλα τα στοιχεία της λίστας. Η έξοδος του παραπάνω αποσπάσματος κώδικα είναι:

47
c
Fiat
d
250

Διαμέριση λίστας

Μπορούμε να εξάγουμε ένα τμήμα μιας λίστας ορίζοντας την αρχική και τελική θέση του τμήματος μέσα σε τετράγωνες αγκύλες χωρισμένες με άνω και κάτω τελείες. Το τμήμα που παίρνουμε με αυτό τον τρόπο είναι υπό μορφή λίστας. Αν s μια λίστα, διακρίνουμε τους ακόλουθους τρόπους:
s[x:y] δίνει το τμήμα μιας λίστας που αρχίζει από το x-στο στοιχείο (περιλαμβάνεται) και τελειώνει στο y-στο στοιχείο (δεν περιλαμβάνεται)
s[:y] δίνει το τμήμα μιας λίστας που αρχίζει από το στοιχείο με δείκτη 0 (το πρώτο στοιχείο – περιλαμβάνεται) και τελειώνει στο y-στο στοιχείο (δεν περιλαμβάνεται)
s[x:] δίνει το τμήμα μιας λίστας που αρχίζει από το x-στο στοιχείο (περιλαμβάνεται) μέχρι το τέλος της λίστας.

Μέθοδοι λιστών

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

όνομα_λίστας.μεθοδος(παράμετρος)

Στην Python έχουμε τις παρακάτω μεθόδους για λίστες:
1) append(obj)   προσθέτει το στοιχείο obj στη λίστα. Το στοιχείο obj μπορεί να είναι αριθμητική τιμή, συμβολοσειρά, λίστα κ.ά.

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> colors.append('Ασπρο')
>>> print(colors)
['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Ασπρο']

2) extend(seq)  προσθέτει την ακολουθία seq στη λίστα

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> fruits = ['Αχλάδι', 'Μήλο', 'Βερίκοκο']
>>> colors.extend(fruits)
>>> print(colors)
['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Αχλάδι', 'Μήλο', 'Βερίκοκο']
>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> numbers = [10, 15, 20]
>>> colors.extend(numbers)
>>> print(colors)
['Μαύρο', 'Κίτρινο', 'Κόκκινο', 10, 15, 20]

3) insert(pos, obj)  προσθέτει στη λίστα το στοιχείο obj στη θέση pos

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> colors.insert(1, 'Ασπρο')
>>> print(colors)
['Μαύρο', 'Άσπρο',  'Κίτρινο', 'Κόκκινο']

4) pop(pos)  αφαιρεί και επιστρέφει το στοιχείο μιας λίστας, το οποίο βρίσκεται στη θέση pos. Αν δεν ορίσουμε όρισμα μέσα στις παρενθέσεις αφαιρεί και επιστρέφει το τελευταίο στοιχείο της λίστας.

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Άσπρο']
>>> x=colors.pop(2)
>>> print(x)
Κόκκινο
>>> print(colors)
['Μαύρο', 'Κίτρινο', 'Άσπρο']
>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Άσπρο']
>>> x = colors.pop()
>>> print(x)
Άσπρο
>>> print(colors)
['Μαύρο', 'Κίτρινο', 'Κόκκινο']

5) remove(obj) αφαιρεί μόνο την πρώτη εμφάνιση του στοιχείου obj από την λίστα

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> colors.remove('Κίτρινο')
>>> print(colors)
['Μαύρο', 'Κόκκινο']

6) copy()  δίνει ένα αντίγραφο της λίστας

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> x=colors.copy()
>>> print(x)
['Μαύρο', 'Κίτρινο', 'Κόκκινο']

7) clear()  διαγράφει όλα τα στοιχεία μιας λίστας

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> colors.clear()
>>> print(colors)
[]

8) count(obj)  δίνει το πλήθος του στοιχείου obj στη λίστα

>>> colors = ['Μαύρο', 'Κίτρινο', 'Μαύρο', 'Κόκκινο']
>>> x = colors.count('Μαύρο')
>>> print(x)
2

9) index(obj)  δίνει την πρώτη θέση που εμφανίζεται το στοιχείο obj  στη λίστα

>>> colors = ['Μαύρο', 'Κίτρινο', 'Μαύρο', 'Κόκκινο']
>>> x = colors.index('Μαύρο')
>>> print(x)
0

10) reverse()  αντιστρέφει την σειρά των στοιχείων που βρίσκονται στη λίστα

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> colors.reverse()
>>> print(colors)
['Κόκκινο', 'Κίτρινο', 'Μαύρο']

11) sort()  ταξινομεί τα στοιχεία της λίστας κατά αύξουσα σειρά. Αν θέσουμε την παράμετρο reverse της μεθόδου σε True ταξινομεί την λίστα κατά φθίνουσα σειρά. Η προεπιλεγμένη τιμή της είναι η False

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Aσπρο']
>>> colors.sort()
>>> print(colors)
['Άσπρο', 'Κίτρινο', 'Κόκκινο', 'Μαύρο']
>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Aσπρο']
>>> colors.sort(reverse=True)
>>> print(colors)
['Μαύρο', 'Κόκκινο', 'Κίτρινο', 'Ασπρο']

Συναρτήσεις λιστών

Στην Python μπορούμε να χρησιμοποιήσουμε τις ακόλουθες συναρτήσεις για λίστες:

len(list)  δίνει το πλήθος των στοιχείων μιας λίστας:

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Ασπρο']
>>> x=len(colors)
>>> print(x)
4

max(list)  δίνει το μεγαλύτερο στοιχείο σε αξία μέσα σε μια λίστα

>>> numbers = [10, 5, 20, 8]
>>> x = max(numbers)
>>> print(x)
20

min(list)  δίνει το μικρότερο στοιχείο σε αξία μέσα σε μια λίστα

>>> numbers = [10, 5, 20, 8]
>>> x = min(numbers)
>>> print(x)
5

Οι συναρτήσεις range και list

Με την Python μπορούμε να δημιουργήσουμε μια ακολουθία τιμών με την συνάρτηση range,  με εύρος τιμών από το πρώτο ακέραιο όρισμα της, έως το δεύτερο ακέραιο όρισμα μείον ένα. Χρησιμοποιούμε την συνάρτηση list η οποία μετατρέπει την ακολουθία τιμών που δίνει η συνάρτηση range σε λίστα. Ακολουθεί ένα παράδειγμα:

>>> numbers = list(range(5, 10))
>>> print(numbers)
[5, 6, 7, 8, 9]

Στο παράδειγμα μας, η συνάρτηση range παράγει την ακολουθία τιμών 5, 6, 7, 8, 9. Αυτή την ακολουθία τιμών την παίρνει η συνάρτηση list και την μετατρέπει σε λίστα.

Αν στην συνάρτηση range δώσουμε ένα μόνο ακέραιο όρισμα, η ακολουθία τιμών που παράγει ξεκινά από το 0 και με βήμα ίσο με 1 φτάνει έως στο ακέραιο όρισμα της, μειωμένο κατά μια μονάδα. Π.χ. η συνάρτηση range(5) παράγει την ακολουθία τιμών 0, 1, 2, 3, 4.

Αν στη συνάρτηση range δώσουμε τρία ακέραια ορίσματα, η ακολουθία τιμών που παράγει είναι από το πρώτο ακέραιο όρισμα έως το δεύτερο ακέραιο όρισμα (μειωμένο κατά ένα) αλλά με  βήμα το τρίτο ακέραιο όρισμα. Π.χ. η συνάρτηση range(3, 10, 2) παράγει την ακολουθία τιμών 3, 5, 7, 9

Υπολογιζόμενες λίστες

Με την Python μπορούμε να δημιουργήσουμε υπολογιζόμενες λίστες. Αυτές έχουν την ακόλουθη σύνταξη:

υπολογιζόμενη_λίστα = [έκφραση for μεταβλητή in ακολουθία]

Η εκφραση υπολογίζεται μια φορά για κάθε στοιχείο της λίστας. Στον παρακάτω κώδικα φαίνεται η δημιουργία λίστας με τα τετράγωνα των ακεραίων από το 0 έως το 4

>>> newlist = [i**2 for i in range(5)]
>>> print(newlist)|
[0, 1, 4, 9, 16]

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

>>> newlist = [i**2 for i in range(11) if i%2 == 0]
>>> print(newlist)
[0, 4, 16, 36, 64, 100]

Επεξεργασία λιστών

Μπορούμε να κάνουμε συνένωση λιστών με τον τελεστή + όπως στο ακόλουθο παράδειγμα:

>>> colors1 = ['Μαύρο', 'Κίτρινο', 'Κόκκινο']
>>> colors2 = ['Μπλε', 'Άσπρο']
>>> colors = colors1 + colors2
>>> print(colors)
['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Μπλε', 'Άσπρο']

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

>>> colors = ['Μαύρο', 'Άσπρο', 10]
>>> x = colors*3
>>> print(x)
['Μαύρο', 'Άσπρο', 10, 'Μαύρο', 'Άσπρο', 10, 'Μαύρο', 'Άσπρο', 10]

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

>>> colors = ['Μαύρο', 'Κίτρινο', 'Κόκκινο', 'Άσπρο']
>>> colors[1] = 'Μπλε'
>>> print(colors)
['Μαύρο', 'Μπλε', 'Κόκκινο', 'Άσπρο']