Λίστες Η πιο σημαντική ακολουθία της Python, μοιάζουν με τους πίνακες των παραδοσιακών γλωσσών αλλά είναι πολύ ποιο ευέλικτες: μπορεί να περιέχουν στοιχεία διαφορετικού τύπου και μας παρέχουν τη δυνατότητα να αυξομειώνουμε το μέγεθός τους κατά βούληση. Μια λίστα αποτελείται από στοιχεία χωρισμένα με κόμμα ανάμεσα σε ένα ζεύγος τετράγωνων αγκυλών : Lista=[ red, green, blue ] Το πλήθος των στοιχείων μια λίστας δίνεται από τη συνάρτηση len(): Len(Lista)
Λίστες Η πρόσβαση στα στοιχεία μιας λίστας γίνεται μέσω δεικτοδότησης (indexing). Το πρώτο στοιχείο της λίστας έχει δείκτη 0. Η εξαγωγή ενός τμήματος μιας λίστας γίνεται με τη λειτουργίας της διαμέρισης όπως και στα αλφαριθμητικά:
Λίστες Για να ορίσουμε μια κενή λίστα εκχωρούμε ένα άδειο ζευγάρι αγκυλών: Lista=[] Η Python υποστηρίζει επίσης της λεγόμενες «υπολογιζόμενες λίστες» (list comprehensions) και μας παρέχει μια συντακτική δομή για δημιουργία λιστών από υπάρχουσες: comprehensionslist=[έκφραση for μεταβλητή in ακολουθία] NeaLista=[2**i for i in range(11)] #δημιουργια λιστας των δυνάμεων του 2 για τους αριθμούς 0-10
Λίστες Επεκτείνοντας το προηγούμενο παράδειγμα χρησιμοποιούμε και την εντολή if για να υπολογίσουμε τις δυνάμεις του 2 για τους περιττούς αριθμούς: NeaLista=[2**i for i in range(11) if i%2==1]
Λίστες Μια Λίστα μπορεί να αποτελείται και από άλλες λίστες: Lista=[['Χρήστος',47],['Κωνσταντίνος',11],['Αναστασία',15]] Η εντολή Lista[0] θα δώσει έξοδο: [ Χρήστος,47] Για να προσπελάσουμε τα επιμέρους στοιχεία από τα οποία αποτελείται το πρώτο στοιχείο (που είναι και αυτό λίστα), χρησιμοποιούμε και δεύτερο δείκτη: Lista[0][0] θα δώσει στην έξοδο Χρήστος Lista[0][1] θα δώσει στην έξοδο 47
Βασικές Λειτουργίες Λιστών Η συνένωση των λιστών γίνεται με τον τελεστή + όπως και στα αλφαριθμητικά: Πολλαπλασιάζοντας μια λίστα με έναν ακέραιο αριθμό Ν έχουμε ως αποτέλεσμα μια νέα λίστα που αποτελείται Ν φορές τα στοιχεία της αρχικής:
Βασικές Λειτουργίες Λιστών H προσθήκη ενός νέου στοιχείου σε μια λίστα γίνεται με τη μέθοδο append(): Η αφαίρεση ενός στοιχείου από τη λίστα γίνεται με τη μέθοδο remove():
Βασικές Λειτουργίες Λιστών Η μέθοδος pop() χωρίς όρισμα αφαιρεί το τελευταίο στοιχείο και μας το επιστρέφει. Εναλλακτικά μπορούμε να την καλέσουμε με όρισμα έναν δείκτη, ώστε να επιστρέψει/αφαιρέσει το αντίστοιχο στοιχείο:
Βασικές Λειτουργίες Λιστών Οι μέθοδοι append() και pop() μπορούν να χρησιμοποιηθούν για τη δημιουργία στοίβας (stack) ή ουράς (queue). Η append() προσθέτει ένα στοιχείο στο τέλος της λίστας και η pop() το αφαιρεί (LIFO), ενώ η κλήση pop(0) αφαιρεί το πρώτο στοιχείο της λίστας (FIFO) Η μέθοδος insert() έχει δύο ορίσματα έναν δείκτη και ένα στοιχείο το οποίο προσθέτει στη συγκεκριμένη θέση:
Βασικές Λειτουργίες Λιστών Η μέθοδος extend() στη πραγματικότητα συνενώνει λίστες. Δέχεται ένα όρισμα που είναι λίστα και προσθέτει τα στοιχεία της στο τέλος: Η μέθοδος reverse() μας επιστρέφει τα στοιχεία της λίστας:
Βασικές Λειτουργίες Λιστών Η μέθοδος count() δέχεται ένα όρισμα και μας επιστρέφει το πλήθος των εμφανίσεων της τιμής του ορίσματος στη λίστα: Η μέθοδος sort() ταξινομεί τα στοιχεία της λίστας κατά αύξουσα σειρά:
Βασικές Λειτουργίες Λιστών Η μέθοδος Index() επιστρέφει τη θέση της πρώτης εμφάνισης ενός στοιχείου στη λίστα: Ένα στοιχείο μιας λίστας συμπεριφέρεται όπως ακριβώς και μια μεταβλητή. Ο απλούστερος τρόπο αλλαγής της τιμής ενός στοιχείου είναι μέσω του δείκτη του: Λίστα μπορούμε να δημιουργήσουμε και με τη μέθοδο κατασκευαστή της κλάσης (constructor) που είναι η list():
Βασικές Λειτουργίες Λιστών Η σάρωση μιας λίστας γίνεται με ένα βρόγχο for:
Βασικές Λειτουργίες Λιστών Αν κατά τη σάρωση χρειαζόμαστε το στοιχείο και τη θέση του χρησιμοποιούμε την ενσωματωμένη συνάρτηση enumerate():
Βασικές Λειτουργίες Λιστών H Python δε διαθέτει πίνακες με τη μορφή που υπάρχουν σε άλλες γλώσσες προγραμματισμού, (υπάρχουν βιβλιοθήκες που κάνουν αυτή τη δουλειά όπως η NumPy). Στη βασική έκδοση μπορούμε να υλοποιήσουμε δομές πινάκων με τη βοήθεια λιστών. Ένας πίνακας μιας διάστασης αντιστοιχεί σε μια λίστα, ενώ ένας πίνακας 2 διαστάσεων αποτελείται από μια λίστα της οποίας κάθε στοιχείο είναι μια άλλη λίστα. matrix = [] for i in range(3): #δηλώνουμε μια κενή λίστα matrix.append([]) #προσθέτουμε ως στοιχεία 3 λίστες for j in range(3): matrix[i].append(i+j) #περνάμε δεδομένα σε κάθε μια από της 3 λίστες print(matrix)
Βασικές Λειτουργίες Λιστών Ένας πιο γρήγορος τρόπος δημιουργίας πίνακα 2 διαστάσεων είναι με τη λειτουργία υπολογιζόμενης λίστας (list comprehensions). To Επόμενο πρόγραμμα δημιουργεί έναν πίνακα 4χ4 με τυχαίες μονοψήφιες τιμές: (4.02) import random print('array 4x4 with random values:') Α = [[random.randint(0,9) for x in range(4)] for x in range(4)] for i in range(len(α)): for j in range(len(α[0])): print('%3d' % Α[i][j], end='') print() print('transpose rows and columns:') Α = [[row[i] for row in Α] for i in range(4)] for i in range(len(α)): for j in range(len(α[0])): print('%2d' % Α[i][j], end='') print()
Πλειάδες Οι πλειάδες (tuples) ή αλλιώς διατεταγμένες λίστες, είναι δομές παρόμοιες με τις λίστες με τη διαφορά ότι δεν μπορούν να μεταβληθούν (immutable) Συνήθως οι λίστες χρησιμοποιούνται για ομοιογενείς ακολουθίες, ενώ οι πλειάδες για ανομοιογενείς. Μια πλειάδα είναι ιδανική δομή δεδομένων για την αντιστοίχιση μιας εγγραφής ενός πίνακα μιας βάσης δεδομένων Οι πλειάδες ορίζονται με παρόμοιο συντακτικό αλλά με παρενθέσεις () αντί για []:
Πλειάδες Η πλειάδα παραμένει σταθερή καθ όλη τη διάρκεια εκτέλεσης του προγράμματος. Η πρόσβαση στα στοιχεία της γίνεται με δεικτοδότηση, όπως ακριβώς και με τις λίστες. Και στις πλειάδες το πρώτο στοιχείο έχει δείκτη 0 Αν προσπαθήσουμε να αλλάξουμε κάποιο στοιχείο της παραπάνω λιστας:
Πλειάδες Tuple packing: λειτουργία δημιουργίας μιας πλειάδας μέσω εκχώρησης τιμών χωρισμένων με κόμμα: Tuple unpacking: Η αντίστροφη λειτουργία δηλαδή η κατανομή των τιμών μιας πλειάδας σε μεταβλητές
Πλειάδες Μια πλειάδα ορίζεται επίσης μ ένα ζευγάρι κενών παρενθέσεων ή με ένα στοιχείο ακολουθούμενο από κόμμα: Η συνένωση δύο πλειάδων γίνεται με τη χρήση του τελεστή + όπως και στις λίστες:
Πλειάδες Στις πλειάδες επίσης λειτουργούν και οι τελεστές *,==,!= και in τους οποίους γνωρίσαμε από τις λίστες Η μετατροπή ενός αντικειμένου σε πλειάδα γίνεται με τη συνάρτηση tuple(). Το πρόγραμμα που ακολουθεί μετατρέπει μια πλειάδα σε λίστα, την ταξινομεί κατά φθίνουσα σειρά και την μετατρέπει πάλι σε πλειάδα: # 4-03.py mytuple = ('delta', 'sigma', 'alpha', 'beta', 'theta') mylist = list(mytuple) mylist.sort(reverse=true) mytuple = tuple(mylist) print('sorted tuple:', mytuple)
Πλειάδες Εκτός από τη συνάρτηση sort() εφαρμογή στις πλειάδες έχουν και οι συναρτήσεις: len(), min(),max(),count(),index() που είδαμε στις λίστες. Ο τελεστής In εφαρμόζεται επίσης για να δώσει πληροφορία σχετική με τον αν κάποιο στοιχείο περιέχεται στην πλειάδα:
Λεξικά Ένα λεξικό (dictionary) είναι μια δομή δεδομένων που αποτελείται από ζεύγη τη μορφής κλειδί τιμή (key-value). Τα κλειδιά είναι μοναδικά και καθένα από αυτά αντιστοιχεί σε μια τιμή. Τα στοιχεία του λεξικού δεν έχουν συγκεκριμένη σειρά και η αναφορά σε κάποιο στοιχείο γίνεται μέσω του κλειδιού. Ένα κλειδί μπορεί να είναι αριθμός, αλφαριθμητικό ή και μια πλειάδα (με αριθμούς και αλφαριθμητικά), η δε τιμή μπορεί να είναι οποιουδήποτε τύπου. Το λεξικό της Python είναι το αντίστοιχο ενός πίνακα κατακερματισμού (hash table) άλλων γλωσσών προγραμματισμού. Ένα κενό λεξικό δημιουργείται με ένα ζευγάρι κενών αγκίστρων και στη συνέχεια χρησιμοποιούμαι το όνομα του λεξικού και τετράγωνες αγκύλες για να προσθέσουμε ζευγάρια δεδομένων:
Λεξικά Η αλλαγή τιμής γίνεται με τη χρήση του τελεστή ανάθεσης. Αν το κλειδί υπάρχει θα ενημερωθεί με τη νέα τιμή αν δεν υπάρχει θα γίνει εισαγωγή νέου ζεύγους: Στην περίπτωση που ζητήσουμε από το λεξικό να μας επιστρέψει τη τιμή ανύπαρκτου κλειδιού θα εμφανιστεί μήνυμα λάθους:
Λεξικά Εναλλακτικά μπορούμε να ορίσουμε ένα νέο λεξικό χρησιμοποιώντας την άνω και κάτω τελεία για το διαχωρισμό κλειδιών και τιμών και κόμμα μεταξύ των στοιχείων: Επίσης μπορούμε να χρησιμοποιήσουμε τον κατασκευαστή της κλάσης για τη δημιουργία ενός νέου λεξικού από μια ακολουθία ζευγών κλειδιού τιμής :
Λεξικά Η λειτουργία υπολογιζόμενα λεξικά (dict comprehensions) εφαρμόζεται με την ίδια σύνταξη με αυτή των υπολογιζόμενων λιστών (αντί για τις τετράγωνες αγκύλες των λιστών χρησιμοποιούμε άγκιστρα) Η προσπέλαση στα επιμέρους στοιχεία ενός λεξικού γίνεται με ένα βρόχο for και τη μέθοδο key() που επιστρέφει μια λίστα με τα ονόματα των κλειδιών του:
Λεξικά Η μέθοδος values() επιστρέφει μια λίστα με όλες τις τιμές του λεξικού Η μέθοδος items() μας επιστρέφει μια λίστα με πλειάδες ζευγαριών (κλειδί, τιμή):
Λεξικά Ο έλεγχος για το αν κάποια τιμή βρίσκεται στο λεξικό γίνεται με τον τελεστή in : Η μέθοδος get(key[,d]) επιστρέφει το στοιχείο με κλειδί key. Αν δεν υπάρχει το κλειδί επιστρέφει το d. Η προκαθορισμένη τιμή επιστροφής είναι το None
Λεξικά Η μέθοδος pop(key[,d]) διαγράφει το στοιχείο με κλειδί key και επιστρέφει την τιμή του στοιχείου ή d αν δεν υπάρχει το στοιχείο: Η μέθοδος clear() διαγράφει όλα τα στοιχεία ενός λεξικού. Η μέθοδος fromkeys(seq[,d]) δημιουργεί ένα νέο λεξικό με κλειδιά από την ακολουθία seq και τιμές d ή None αν δεν καθοριστεί. Η μέθοδος setdefault(key[,d]) επιστρέφει την τιμή του key εφόσον το key υπάρχει στο λεξικό. Αν το κλειδί δεν υπάρχει, το προσθέτει στο λεξικό με αντίστοιχη τιμή d. Η μέθοδος αυτή έχει ως προκαθορισμένη τιμή του d το None
Λεξικά # 4-04.py icc = {}.fromkeys(['gr', 'de', 'fr'], 2) print(icc) icc.setdefault('it', 2) icc.setdefault('uk') icc.setdefault('usa', 3) print('length of dictionary is', len(icc)) del icc['de'] print(icc) icc.clear() print('length of dictionary is', len(icc)) H len() μας επιστρέφει το πλήθος των στοιχείων μια ακολουθίας και με την εντολή del διαγράφουμε ένα στοιχείο της. Η εντολή del με όρισμα το όνομα του λεξικού μόνο, διαγράφει ολόκληρο το λεξικό
Σύνολα Τα σύνολα (set) είναι συλλογές από μη διατεταγμένα μοναδικά στοιχεία και χρησιμοποιούνται σε μαθηματικές πράξεις συνόλων (ένωση, τομή κλπ). Ένα σύνολο μπορεί να αποτελείται από διαφορετικού τύπου στοιχεία, αλλά δεν μπορεί να περιέχει στοιχεία που μεταβάλλονται (mutable) όπως είναι για παράδειγμα οι λίστες. Ένα σύνολο δημιουργείται με την κλήση της συνάρτησης set(): Ένα σύνολο ορίζεται με άγκιστρα και τα στοιχεία της ακολουθίας είναι μοναδικά και μη διατεταγμένα, έτσι μπορούμε να ορίσουμε ένα σύνολο και ως εξής:
Σύνολα Προσοχή: δεν μπορούμε να δημιουργήσουμε ένα σύνολο που να περιέχει ως στοιχείο μια λίστα ή ένα λεξικό, μπορούμε όμως να χρησιμοποιήσουμε μία λίστα για να δημιουργήσουμε ένα σύνολο από τα στοιχεία της:
Σύνολα Η προσθήκη ενός στοιχείου σε ένα σύνολο γίνεται με τη μέθοδο add() και πολλαπλών στοιχείων με τη μέθοδο update(): Η αφαίρεση ενός στοιχείου από ένα σύνολο γίνεται με τη μέθοδο remove(). Ο έλεγχος αν ένα στοιχείο είναι μέλος ενός συνόλου γίνεται με τον τελεστή In και το πλήθος των στοιχείων μας το δίνει η συνάρτηση len():
Σύνολα Οι μέθοδοι issubset() και issuperset() εξετάζουν αν ένα σύνολο είναι υποσύνολο ή υπερσύνολο ενός άλλου: Η τομή και η ένωση δύο συνόλων δίνονται από τις μεθόδους intersection() και union() αντίστοιχα: Η μέθοδος difference() μας δίνει τη διαφορά δύο συνόλων. Αν χρειαζόμαστε ένα σύνολο που δεν τροποποιείται μπορούμε να χρησιμοποιήσουμε τη συνάρτηση frozenset()
Λίγος κώδικας # 4-05.py alist = [1, 2, 3, 4, 5] blist = [1, 2, 3, 4, 5] clist = alist alist[2] = 'Θάσος' print(alist is clist) print(alist == blist)
Λίγος κώδικας Η συνάρτηση sorted() μπορεί να χρησιμοποιηθεί στην ταξινόμηση μιας λίστας. Στο παράδειγμα που ακολουθεί ταξινομούμε μια λίστα με αλφαριθμητικά σύμφωνα με το μήκος τους και τα εμφανίζουμε με ένα βρόγχο for # 4-06.py names = ['Klaus', 'Ted', 'Vladimir', 'Peter', 'Anna'] snames = sorted(names, key=len, reverse=true) #Με το key=len καθορίζουμε τη συνάρτηση σύμφωνα με την for name in snames: # οποία θέλουμε να γίνει ταξινόμηση και με το reverse=true print(name + ' has ' + str(len(name)) + ' chars') # δηλώνουμε ότι θέλουμε αντίστροφη σειρά ταξινόμησης
Λίγος κώδικας # 4-07.py import random rlist = [random.randint(1,1001) for i in range(10)] #Δημιουργούμε μια λίστα 10 στοιχείων με τυχαίους αριθμούς από 1 μέχρι το 1000 MIN = MAX = rlist[0] for i in range(len(rlist)): if rlist[i] < MIN: MIN = rlist[i] if rlist[i] > MAX: MAX = rlist[i] print('minimum is', MIN, 'and maximum is', MAX) print('with built-in functions:', min(rlist), max(rlist)) #χρησιμοποιούμε τις ενσωματωμένες συναρτήσεις min() και max() για να βρούμε τις ίδιες τιμές της ακολουθίας
Λίγος κώδικας πολλαπλασιασμός τετραγωνικών πινάκων 1. # 4-09.py 2. n = int(input('enter the dimension: ')) 3. print('enter values for the Matrix A') 4. A = [] 5. for i in range(0, n): 6. A.append([int(x) for x in input('').split(' ')]) #προσθέτουμε στοιχεία στο πίνακα, ο τεμαχισμός των δεδομένων γίνεται με τη split() 7. print('enter values for Matrix B') #προκαθορισμένος χαρακτήρας διαχωρισμού είναι το κενό 8. B = [] 9. for i in range(0, n): 10. B.append([int(x) for x in input('').split()]) #προσθέτουμε στοιχεία στο πίνακα 11. C = [[0 for i in range(n)] for j in range(n)] #δημιουργούμε νέο πίνακα με τις ίδιες διαστάσεις και μηδενικά στοιχεία 12. for i in range(len(a)): 13. for j in range(len(b[0])): 14. for k in range(len(b)): 15. C[i][j] += A[i][k] * B[k][j] 16. print('matrix C = A * B') 17. for item in C: 18. print(item)
Λίγος κώδικας τηλεφωνικός κατάλογος 1. # 4-11.py 2. phones = {} 3. phones['soula'] = '2138'; phones['koula'] = '2156' 4. phones['toula'] = '2133'; phones['roula'] = '2128' 5. ch = 0 6. while ch!= 4: 7. print('\n=== Menu ===') 8. print('1. Search\n2. Print List\n3. Clear List\n4. Exit') 9. ch = int(input('your choice please:')) 10. if ch < 1 or ch > 4: 11. print('1, 2, 3 or 4 only permitted') 12. continue 13. if ch == 1: 14. name = input('give name to search:') 15. if name in phones.keys(): 16. print('%s : is %s' % (name, phones[name])) 17. else: 18. print('%s is not in dictionary' % (name)) 19. if ch == 2: 20. if len(phones) == 0: 21. print('phone book is empty!') 22. else: 23. print('\nname', 'Phone') 24. print('=============') 25. for k,v in phones.items(): 26. print(k, v) 27. if ch == 3: 28. ans = input('are you sure? (y/n)') 29. if ans == 'y': phones.clear()