Δομές Δεδομένων Ι
Κέρος Α. Ιωάννης Καθηγητής Πληροφορικής ΠΕ19 1ο ΕΠΑΛ Κιλκίς
Δομές Δεδομένων Τι είναι μία δομή δεδομένων; Μία δομή δεδομένων είναι ένα σχήμα οργάνωσης των δεδομένων, με άλλα λόγια ένα οργανωμένο σύνολο δεδομένων πάνω στο οποίο μπορεί να πραγματοποιηθεί ένα σύνολο ενεργειών. Ποιες είναι βασικές δομές δεδομένων που υποστηρίζει η Python; • Λίστες (Lists) – Τροποποιήσιμα - Mutable Βασική δομική λίθος όλων των υπολοίπων
• Πλειάδες (Tuples) – Μη τροποποιήσιμα - Immutable
• Σύνολα (Sets) – Τροποποιήσιμα - Mutable • Λεξικά (Dictionaries) – Τροποποιήσιμα - Mutable Για γρήγορη αναζήτηση και ανάκληση πληροφορίας σχετική με κάποια συμβολοσειρά
• Συμβολοσειρές (Strings) – Μη τροποποιήσιμα - Immutable Τον γνωρίσαμε ήδη ως τύπο δεδομένων
Βιβλιοθήκη, ράφια, βάζω – βγάζω – ταξινομώ κοκ βιβλία
Στατικές Δομές Δεδομένων • Το μέγεθος τους καθορίζεται κατά την φάση του προγραμματισμού, είναι δηλαδή γνωστό κατά την συγγραφή του προγράμματος προκειμένου να δεσμευτεί η απαραίτητη μνήμη για την αναπαράσταση της δομής. • Κατά την εκτέλεση του προγράμματος το μέγεθος τους παραμένει σταθερό, δεν μπορούν να προστεθούν ή να αφαιρεθούν αντικείμενα από την δομή. • Στον κόσμο του προγραμματισμού, η πιο γνωστή στατική δομή είναι ο πίνακας (στην Python υπάρχουν και οι πλειάδες).
περισσότερα στην αντίστοιχη ενότητα παρακάτω
Δυναμικές Δομές Δεδομένων •
Στηρίζονται στην λειτουργία της δυναμικής παραχώρησης μνήμης. Το μέγεθος των δυναμικών δομών καθορίζεται κατά την φάση της εκτέλεσης του προγράμματος, δεν είναι δηλαδή απαραίτητο να είναι γνωστό κατά την συγγραφή του προγράμματος προκειμένου να δεσμευτεί η απαραίτητη μνήμη για την αναπαράσταση της δομής.
•
Κατά την εκτέλεση του προγράμματος το μέγεθος τους μπορεί να μεταβάλλεται, μπορούν δηλαδή να προστεθούν ή να αφαιρεθούν αντικείμενα.
•
Στον κόσμο του προγραμματισμού (και στην Python), η πιο γνωστή δυναμική δομή είναι οι λίστες.
•
Με δομικό συστατικό την λίστα, η Python υλοποιεί όλες τις σύνθετες δομές δεδομένων όπως στοίβα, ουρά, δέντρο κ.λπ.
•
Ουσιαστικά οι λίστες στην Python είναι πίνακες, με μία βασική διαφορά: το μέγεθος μπορεί να αυξομειώνεται σε αντίθεση με τους πίνακες.
Συμβολοσειρές - Εισαγωγή Συμβολοσειρά είναι μια ακολουθία χαρακτήρων η οποία μπορεί να αποτελείται από περισσότερες από μία λέξεις που είναι γραμμένες είτε στην Ελληνική, είτε στην Αγγλική, είτε σε οποιαδήποτε γλώσσα που υποστηρίζεται από το πρότυπο Unicode. Μια συμβολοσειρά την ορίζουμε τοποθετώντας αμφίπλευρα μονά ή διπλά εισαγωγικά.
word = “Creativity” 0
1
2
3
4
5
6
7
8
9
C
r
e
a
t
i
v
i
t
y
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
>>>print(word) >>>print(word[1]) >>>print(word[-2]) >>> word[0]= "X"
Creativity r t Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: 'str' object does not support item assignment
Immutable (Αμετάβλητα)
Ο πίνακας χαρακτήρων ASCII. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
! # $ % & ' ( ) * + , . / 0 1 2 3
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
h i j k l m n o p q r s t u v w x y z { | } ~ • €
130 , 131 ƒ 132 „ 133 … 134 † 135 ‡ 136 137 ‰ 138 139 ‹ 140 141 142 143 144 145 ‘ 146 ’ 147 “ 148 ” 149 • 150 – 151 — 152 153 ™ 154 155 ›
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
΅ Ά £ ¤ ¥ ¦ § ¨ © « ¬ ® ― ° ± ² ³ ΄ µ
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
¶ · Έ Ή Ί » Ό ½ Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 6 233
Π Ρ
234 235 236 Σ 237 T 238 Υ 239 Φ 240 Χ 241 Ψ 242 Ω 243 244 245 246 247 248 249 250 α 251 β 252 γ 253 δ 254 ε 255 ζ η θ ι
κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ
Συμβολοσειρές – Σύγκριση χαρακτήρων word = “Creativity” 0
1
2
3
4
5
6
7
8
9
C
r
e
a
t
i
v
i
t
y
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
> word[5] = word[3] < word[9]
word[3] Αξίζει να θυμάστε:
word[-10] word[7] word[6]
!= word[5]
0,1, 2, … , 9, A, B, C, …, Z, a, b, c, …, z, Α, Β, Γ, …, Ω, α, β, γ, …, ω
Συμβολοσειρές – Άσκηση Ας πειραματιστούμε… Άσκηση (PowerPointStr1.py) Ορίστε μια μεταβλητή a με περιεχόμενο την τιμή «Καλημέρα» Ορίστε μια μεταβλητή b με περιεχόμενο την τιμή «ηλιόλουστη μέρα» Αθροίστε τις μεταβλητές a και b σε μία μεταβλητή z. Τοποθετείστε το διπλάσιο της μεταβλητής a στην μεταβλητή d. Εμφανίστε στην οθόνη τις τιμές των μεταβλητών a, b, z, d. Εμφανίστε στην οθόνη το μήκος του αλφαριθμητικού b. Εμφανίστε στην οθόνη τον πρώτο χαρακτήρα του αλφαριθμητικού a. Εμφανίστε στην οθόνη τον δεύτερο χαρακτήρα του αλφαριθμητικού b. Εμφανίστε στην οθόνη τους χαρακτήρες «μέρα» του αλφαριθμητικού b.
Συμβολοσειρές - Συμπεράσματα • Στην Python ο τύπος δεδομένων str αποτελεί μία ακολουθία χαρακτήρων. • Η προσπέλαση κάποιου χαρακτήρα της συμβολοσειράς γίνεται χρησιμοποιώντας τον αριθμό της θέσης του μέσα σε αγκύλες. Η αρίθμηση ξεκινά από το 0. • Η συνάρτηση len() μας επιστρέφει το μήκος μιας συμβολοσειράς.
• Η προσπέλαση ενός τμήματος μιας συμβολοσειράς (slicing) γίνεται με την χρήση του μοντέλου word[ αρχή : τέλος : βήμα ] οπότε επιστρέφεται το μέρος της συμβολοσειράς που ξεκινά από τον χαρακτήρα που είναι στην θέση αρχή μέχρι και τον χαρακτήρα που είναι στην θέση τέλος-1 διασχίζοντας τους χαρακτήρες ανά βήμα. • Εάν χρησιμοποιούμε αρνητικούς αριθμούς δηλώνουμε ότι η αρίθμηση ξεκινά από το τέλος του αλφαριθμητικού.
Συμβολοσειρές – Περισσότερο slicing word = “Creativity”
>>> word[2:5] 'eat' >>> word[:5] 'Creat'
>>> word[6:] 'vity'
>>> word = “X” + word[1:] ‘Xreativity'
>>> word[::2] 'Cetvt'
Συμβολοσειρές – Επιπλέον εξάσκηση
Συμβολοσειρές – Άσκηση Ας πειραματιστούμε πάλι…
Συμβολοσειρές – Συμπεράσματα • Ο τελεστής in ελέγχει αν ένα αντικείμενο ανήκει σε ένα σύνολο αντικειμένων και επιστρέφει True αν υπάρχει και False διαφορετικά. • Εξακολουθούν και ισχύουν οι γνωστοί συγκριτικοί τελεστές οι οποίοι όμως συγκρίνουν με βάση την λεξικογραφική διάταξη των χαρακτήρων. • Ο τύπος str έχει κάποιες εγγενείς μεθόδους τις οποίες μπορούμε να καλέσουμε με τον συμβολισμό . (dot notation) • word.upper() Μετατροπή της λέξης word σε κεφαλαία • word.lower () Μετατροπή της λέξης word σε πεζά • word.capitalize() Μετατροπή της λέξης word με το πρώτο κεφαλαίο και τα υπόλοιπα μικρά • word.find(x) Εύρεση της θέσης του χαρακτήρα x στην λέξη word
Για αναλυτική βοήθεια help(str) και συνοπτική dir(str) • Τα αντικείμενα τύπου str δεν είναι τροποποιήσιμα, είναι όπως λέμε αμετάβλητα (immutable). Με άλλα λόγια δεν μπορούμε να αλλάξουμε μέρος μιας συμβολοσειράς .
w='paok' print(w) w[0]='a'
Συμβολοσειρές – Εξάσκηση στους +, *, in >>> >>> >>> >>>
sent1 = "Show me " sent2 = "the money" s = sent1 + sent2 print(s)
Show me the money
>>> message = “a " >>> print(message * 10) aaaaaaaaaa >>> "money" in s True >>> “honey" in s False
Συμβολοσειρές – Διάσχιση word = ‘epal’ for c in word: print(c)
word = ‘epal’ for i in range(len(word)): print(word[i])
e p a l e p a l
Συμβολοσειρές – Συναρτήσεις και μέθοδοι >>> s = "Show me the money" >>> len(s) 17 >>> s.count("e") 3 >>> s.split() ['Show', 'me', 'the', 'money'] >>> s.replace("e","i") 'Show mi thi moniy'
Συμβολοσειρές – Πολυμορφική συμπεριφορά Lazy evaluation (τεμπέλικη αξιολόγηση - υπολογισμός) στην Python τα πάντα αποφασίζονται την τελευταία στιγμή !!!!
‘keros’ + ‘keros’ + ‘keros’ = 3 * ‘keros’
Λίστες – Εισαγωγή Λίστα είναι μια διατεταγμένη ακολουθία από αντικείμενα συνήθως του ίδιου τύπου (αν και το τελευταίο μπορεί να μην ισχύει απαραίτητα).
names = ["Γιάννης","Γιώργος","Μαρία","Νίκος","Ελένη"] 0
1
2
3
4
"Γιάννης"
"Γιώργος"
"Μαρία"
"Νίκος"
"Ελένη"
-5
-4
-3
-2
-1
Λίστες – Εισαγωγή Λίστα είναι μια διατεταγμένη ακολουθία από αντικείμενα συνήθως του ίδιου τύπου (αν και το τελευταίο μπορεί να μην ισχύει απαραίτητα).
names = ["Γιάννης","Γιώργος","Μαρία","Νίκος","Ελένη"] 0
1
2
3
4
"Γιάννης"
"Γιώργος"
"Μαρία"
"Νίκος"
"Ελένη"
-5
-4
-3
-2
-1
>>> names[0] = "Πολύκαρπος" >>> print(names)
['Πολύκαρπος', 'Γιώργος', 'Μαρία', 'Νίκος', 'Ελένη']
Λίστες – Ομοιότητες με τα strings names = ["Γιάννης","Γιώργος","Μαρία","Νίκος","Ελένη"] >>> names[2:4] ['Μαρία', 'Νίκος']
>>> len(names) 5
>>> "Μαρία" in names True
>>> newnames = names + ["Μάνος","Ευαγγελία"] >>> print(newnames) ['Πολύκαρπος', 'Γιώργος', 'Μαρία', 'Νίκος', 'Ελένη', 'Μάνος', 'Ευαγγελία'] >>> morenames = names * 2 >>> print(morenames) ['Πολύκαρπος', 'Γιώργος', 'Μαρία', 'Νίκος', 'Ελένη', 'Πολύκαρπος', 'Γιώργος', 'Μαρία', 'Νίκος', 'Ελένη']
Λίστες - Άσκηση Ας πειραματιστούμε…
Λίστες - Άσκηση Ας πειραματιστούμε πάλι…
Σε αντίθεση με τις συμβολοσειρές, τα στοιχεία μιας λίστας μπορούν να αλλάξουν (είναι mutable και όχι immutable).
Λίστες Δραστηριότητα 1 Τι θα εμφανίσει στην οθόνη το παρακάτω πρόγραμμα Python; daysofweek=['Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο','Κυριακή'] print('Θα έχω χρόνο την ',daysofweek[6])
Δραστηριότητα 2
Απάντηση:
Θα έχω χρόνο την Κυριακή
Τι θα εμφανίσει στην οθόνη το παρακάτω πρόγραμμα Python; x=[21,23,25,27] y=[5,6,7,8] z=x+y print(z) print(z[1]) z[0]=45 print(z) a=[x,y] print(a) print(a[1][2])
Απάντηση:
[21, 23, 25, 27, 5, 6, 7, 8] 23 [45, 23, 25, 27, 5, 6, 7, 8] [[21, 23, 25, 27], [5, 6, 7, 8]] 7
Λίστες - Διάσχιση fruits = ['banana', 'apple', 'orange', 'lemon', 'strawberry'] for fruit in fruits: print(fruit.upper)
BANANA APPLE ORANGE LEMON STRAWBERRY fruits = ['banana', 'apple', 'orange', 'lemon', 'strawberry'] for i in range(len(fruits)): BANANA print(fruits[i].upper()) APPLE
ORANGE LEMON STRAWBERRY
Λίστες Δραστηριότητα 3 Τι θα εμφανίσει στην οθόνη το παρακάτω πρόγραμμα Python; for a in [15,27,31]: print(a) daysofweek=['Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο','Κυριακή'] for x in daysofweek: print(x) Απάντηση: Δευτέρα 15 Τρίτη 27 Τετάρτη 31 Πέμπτη Παρασκευή Σάββατο Κυριακή
Λίστες Δραστηριότητα 4
Η δήλωση αυτή δηλώνει πως και οι δυο οι λίστες «δείχνουν» στον ίδιο χώρο, είναι δηλαδή εφεξής δίδυμα αδελφάκια
Τι θα εμφανίσει στην οθόνη το παρακάτω πρόγραμμα Python; listX=[1,2,3] listY=listX print('listX=',listX,'listY=',listY) listX[1]=5000 print('listX=',listX,'listY=',listY) listY[2]=100 print('listX=',listX,'listY=',listY) Απάντηση: listX= [1, 2, 3] listY= [1, 2, 3] listX= [1, 5000, 3] listY= [1, 5000, 3] listX= [1, 5000, 100] listY= [1, 5000, 100]
Λίστες – Πρώτες Μέθοδοι >>> fruits = ["banana", "apple"] >>> fruits.append("orange") >>> print(fruits) ['banana', 'apple', 'orange'] >>> fruits.append(["lemon","strawberry"]) >>> print(fruits) ['banana', 'apple', 'orange', ['lemon', 'strawberry']] >>> fruits.extend(["lemon","strawberry"]) >>> print(fruits) ['banana', 'apple', 'orange', 'lemon', 'strawberry'] >>> fruits.reverse() >>> print(fruits) ['strawberry', 'lemon', 'orange', 'apple', 'banana'] >>> alphafruits = sorted(fruits) >>> print(alphafruits) ['apple', 'banana', 'lemon', 'orange', 'strawberry']
Λίστες – Και άλλες μέθοδοι
• • • • •
append: προσθήκη στοιχείων στο τέλος της λίστας. pop: αφαίρεση του τελευταίου ή συγκεκριμένου στοιχείου από μία λίστα. sort: ταξινόμηση λίστας αύξουσα (reverse=False) ή φθίνουσα (reverse=True). extend: συνένωση λιστών προσθέτοντας σε μία υπάρχουσα λίστα μία άλλη. insert: εισαγωγή στοιχείου πριν από συγκεκριμένο στοιχείο.
Περισσότερες μέθοδοι: >>>help(list)
Λίστες Ας πειραματιστούμε πάλι…
• Ο τελεστής : μπορεί να χρησιμοποιηθεί για την δημιουργία αντιγράφου μίας λίστας. • Ο τελεστής = μεταξύ λιστών δεν αντιγράφει απλά μία λίστα σε μία άλλη, τις καθιστά όμοιες, αλλαγή σε μία, οδηγεί σε αλλαγή και στην άλλη.
Λίστες Ας πειραματιστούμε πάλι…
• Προσθέτοντας με τον τελεστή + σε μία υπάρχουσα λίστα μία κενή [], δημιουργούμε ένα αντίγραφο της αρχικής λίστας.
Λίστες Δραστηριότητα 5 Δημιουργήστε μία λίστα με πέντε (5) άγρια ζώα του δάσους. Χρησιμοποιώντας τις μεθόδους append, insert, pop: • Εισάγετε ένα ακόμη ζώο στο τέλος της λίστας, • Εισάγετε ένα ακόμη ζώο στην δεύτερη θέση της λίστας, • Εξάγετε το τελευταίο ζώο της λίστας, • Εξάγετε το τρίτο ζώο της λίστας. Απάντηση:
Λίστες Δραστηριότητα 6 Βρείτε τι κάνει το παρακάτω πρόγραμμα. Επαληθεύστε την υπόθεση σας εκτελώντας το στο προγραμματιστικό περιβάλλον της Python.
Απάντηση:
String σε Λίστες και Λίστες σε string >>> word = "Creativity" >>> listword = list(word) >>> print(listword) ['C', 'r', 'e', 'a', 't', 'i', 'v', 'i', 't', 'y'] >>> words = ["Can","you","see","?"] >>> sentence = " ".join(words) >>> print(sentence) Can you see ?
Λίστες, Προχωρημένα θέματα [ expression for item in list if conditional ] numbers = [x ** 2 for x in range(1,11)] print(numbers)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] numbers = [x ** 2 for x in range(1,11) if x % 2 == 0] print(numbers) [4, 16, 36, 64, 100]
Πίνακες Μονοδιάστατοι πίνακες
Η αρίθμηση των κελιών ξεκινά από το 0
Μονοδιάστατος πίνακας – Δημιουργία και Μηδενισμός
Βήματα για την δημιουργία ενός πίνακα χρησιμοποιώντας την δομή της λίστας: 1. Δημιουργία μίας κενής λίστας 2. Χρήση της μεθόδου append για την προσθήκη στοιχείων
Πίνακες Δημιουργία μονοδιάστατου πίνακα με χρήση συνάρτησης και μηδενισμός του
Εάν θέλουμε να μην βάλουμε τιμή σε κάποιο κελί, χρησιμοποιούμε την τιμή None
Πίνακες Άσκηση Να γραφεί πρόγραμμα Python που θα διαβάζει 10 ακεραίους αριθμούς, θα τους τοποθετεί σε ένα μονοδιάστατο πίνακα 10 θέσεων και θα εμφανίσει το μικρότερο στοιχείο του πίνακα.
ή
Πίνακες Δυσδιάστατοι πίνακες
a=[[1,2,3],[4,5,6],[7,8,9]]
1η γραμμή 2η γραμμή 3η γραμμή Ο 2D πίνακας στην Python μπορεί να θεωρηθεί ως ένας 1D πίνακας που το κάθε στοιχείο του είναι ένας 1D πίνακας
Πίνακες Δυσδιάστατοι πίνακες – Δημιουργία και μηδενισμός πίνακα 4χ3
• Προσοχή στους συμβολισμούς • a ολόκληρος ο πίνακας • a[0] ολόκληρη η 1η γραμμή του πίνακα • a[0][2] το 3ο στοιχείο της 1ης γραμμής του πίνακα
Πίνακες Άσκηση Να γραφεί πρόγραμμα Python που θα διαβάζει 12 ακεραίους αριθμούς, θα τους τοποθετεί σε ένα δυσδιάστατο πίνακα 4 γραμμών και 3 στηλών και θα εμφανίσει το μικρότερο στοιχείο του πίνακα.
Στοίβα, Ουρά με την βοήθεια μονοδιάστατου πίνακα
Σύνολα Τα σύνολα στην Python είναι δομές δεδομένων με σημασιολογία ίδια με αυτή των μαθηματικών. Πρόκειται για μια μη διατεταγμένη ομάδα στοιχείων όπου το κάθε ένα εμφανίζεται μία μόνο φορά.
Πλειάδες (tuples) Πρόκειται για έναν σύνθετο τύπο δεδομένων, με στοιχεία διαφορετικού τύπου τα οποία είναι αμετάβλητα. Παράδειγμα: • Όνομα εργαζομένου • Επώνυμο εργαζομένου • Τηλέφωνο εργαζομένου
Το αρχείο των εργαζομένων θα είναι μία λίστα από πλειάδες
Σημαντική εφαρμογή πλειάδας στην αντιμετάθεση τιμών 2 μεταβλητών χωρίς την χρήση βοηθητικής μεταβλητής
>>>a,b=b,a
Λεξικά Πρόκειται για έναν σύνθετο τύπο δεδομένων, με στοιχεία διαφορετικού τύπου τα οποία είναι αμετάβλητα.