You are on page 1of 23

Δομές Δεδομένων ΙΙ

(Συμβολοσειρές)

Κέρος Α. Ιωάννης
Καθηγητής Πληροφορικής ΠΕ19
1ο ΕΠΑΛ Κιλκίς
Εισαγωγή
Με τον όρο δομή δεδομένων μπορεί να οριστεί ένα σχήμα οργάνωσης σχετικών μεταξύ
τους δεδομένων. Οι ενσωματωμένες δομές δεδομένων στην 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 >>> word[0]= "X"


Creativity Traceback (most recent call last):
File "<input>", line 1, in <module>
>>>print word[1] TypeError: 'str' object does not support item assignment
r
>>>print word[-2]
t Οι συμβολοσειρές είναι αμετάβλητα (immuatble) μεγέθη, δεν μπορεί να τροποποιηθεί
δηλαδή το μέγεθος και το περιεχόμενο τους.
Συμβολοσειρές - Εισαγωγή
w = ‘PYTHON’
0 1 2 3 4 5

P Y T H O N
-6 -5 -4 -3 -2 -1

>>> print w[-1]+w[-6] >>> 'EPAL'[3]


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

Η Ρ Α Κ Λ Α Ρ Α
-8 -7 -6 -5 -4 -3 -2 -1

word[4] > word[3]


Η σύγκριση
βασίζεται στην
word[2] = word[5]
λεξικογραφική
διάταξη των
word[-1] < word[6] χαρακτήρων

word[3] != word[5]
Αξίζει να θυμάστε:

0,1, 2, … , 9, A, B, C, …, Z, a, b, c, …, z, Α, Β, Γ, …, Ω, α, β, γ, …, ω
Συμβολοσειρές – Παραδείγματα
>>> a='one'
>>> b='two'
>>> a<b
True
>>> 3*(a+' '+b)
'one twoone twoone two'
>>> len(a+b)
6
>>> "python"=='python'
True
>>> lang='python'
>>> 'py' in lang Είπαμε
True αμετάβλητα!!
>>> 'tron' not in lang
True
>>> lang[1]=‘k'
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module> lang[1]= 'k'
TypeError: 'str' object does not support item assignment
Συμβολοσειρές – Άσκηση
Ορίστε μια μεταβλητή a με περιεχόμενο την τιμή «Good morning».
Ορίστε μια μεταβλητή b με περιεχόμενο την τιμή «sunny day».
Αθροίστε τις μεταβλητές a και b σε μία μεταβλητή z.
Τοποθετείστε το διπλάσιο της μεταβλητής a στην μεταβλητή d.
Εμφανίστε στην οθόνη τις τιμές των μεταβλητών a, b, z, d.
Εμφανίστε στην οθόνη το μήκος του αλφαριθμητικού b.
Εμφανίστε στην οθόνη τον πρώτο χαρακτήρα του αλφαριθμητικού a.
Εμφανίστε στην οθόνη τον δεύτερο χαρακτήρα του αλφαριθμητικού b.
Εμφανίστε στην οθόνη τους χαρακτήρες «day» του αλφαριθμητικού b.
a='Good morning' Good morning
b='sunny day' sunny day
z=a+b Good morningsunny day
d=a*2
Good morningGood morning
print a
print b 9
print z G
print d u
print len(b) day
print a[0]
print b[1]
print b[6:9]
Συμβολοσειρές – Πρώτα συμπεράσματα
• Στην Python ο τύπος δεδομένων str αποτελεί μία ακολουθία χαρακτήρων.

• Η προσπέλαση κάποιου χαρακτήρα της συμβολοσειράς γίνεται χρησιμοποιώντας


τον αριθμό της θέσης του μέσα σε αγκύλες. Η αρίθμηση ξεκινά από το 0 (από
αριστερά) και από -1 (από δεξιά).

• Η συνάρτηση len() μας επιστρέφει το μήκος μιας συμβολοσειράς.

• Η προσπέλαση ενός τμήματος μιας συμβολοσειράς (slicing) γίνεται με την χρήση


του μοντέλου word[ αρχή : τέλος : βήμα ] οπότε επιστρέφεται το μέρος της
συμβολοσειράς που ξεκινά από τον χαρακτήρα που είναι στην θέση αρχή μέχρι και
τον χαρακτήρα που είναι στην θέση τέλος-1 διασχίζοντας τους χαρακτήρες ανά
βήμα. Περισσότερα σε λίγο …. !!!!!

• Έλεγχος ύπαρξης ενός αλφαριθμητικού μέσα σε ένα άλλο: in

• Έλεγχος μη ύπαρξης ενός αλφαριθμητικού μέσα σε ένα άλλο: not in

• Συνένωση αλφαριθμητικών: +
Συμβολοσειρές –Slicing
>>>word = “Creativity”
>>> word[2:5]
'eat'
>>> word[:5]
'Creat'
>>> word[6:]
'vity'
>>> word[::2]
'Cetvt'
>>> word = “X” + word[1:]
'Xreativity'
Συμβολοσειρές – Επιπλέον εξάσκηση
name='Ioannis Keros' print 'a' in 'python' False
print len(name) 13 print 'j' in 'john' True
print name[0:7] Ioannis print 'J' in ‘john' False
print name[8:13] Keros print 'paok'=='iraklis' False
print name[8:len(name)] Keros print 'paok'!='Paok' True
x=name[0]+name[8] print '1000'!='2' True
print x IK z1='iraklis'
print len('John') 4 print z1.upper() IRAKLIS
print 'John'[3] n print z1.capitalize() Iraklis
print 'John'[-2] h print z1.find('a') 2
print 'IRAKLIS'.lower() iraklis

Ο τύπος str έχει κάποιες εγγενείς μεθόδους τις οποίες μπορούμε να καλέσουμε με τον συμβολισμό . (dot
notation)
•word.upper()  Μετατροπή της λέξης word σε κεφαλαία
•word.lower ()  Μετατροπή της λέξης word σε πεζά
• word.capitalize()  Μετατροπή της λέξης word με το πρώτο κεφαλαίο και τα υπόλοιπα
μικρά
• word.find(x)  Εύρεση της θέσης του χαρακτήρα x στην λέξη word

Για αναλυτική βοήθεια  help(str) και συνοπτική  dir(str)


Συμβολοσειρές – Εξάσκηση στους +, *,
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
e
p
a
l

word = ‘epal’
for i in range(len(word)):
print word[i]
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'
Συμβολοσειρές – Πολυμορφική συμπεριφορά

def times(a,b):
return a*b Lazy evaluation (τεμπέλικη αξιολόγηση - υπολογισμός)
στην Python τα πάντα αποφασίζονται την τελευταία στιγμή !!!!
k=times(2,3)
print k

p=times('keros',3)
print p

6
keroskeroskeros

Μην ξεχνάτε!!!
‘keros’ + ‘keros’ + ‘keros’ = 3 * ‘keros’
Δραστηριότητα 1
Να γράψετε στην Python μία συνάρτηση με όνομα trimSpaces(word) η οποία θα
δέχεται μια λέξη word και θα την επιστρέφει διαγράφοντας τα κενά μεταξύ των
λέξεων.

Για παράδειγμα: The weather is good  Theweatherisgood

def trimSpaces(word):
result=''
for char in word:
if char!=' ':
result+=char
return result

x=raw_input('Δώστε μια φράση:')


print trimSpaces(x)
Δραστηριότητα 2a
Να γράψετε στην Python μία συνάρτηση με όνομα isPalidrome(word) η οποία θα
δέχεται μια λέξη word 5 χαρακτήρων και θα ελέγχει αν είναι παλινδρομική ή όχι.
Παλινδρομικές ονομάζονται οι λέξεις που διαβάζονται το ίδιο από αριστερά και δεξιά.

Για παράδειγμα: radar, madam …


def isPalindrome(word):
if word[0]==word[4] and word[1]==word[3]:
return True
else:
return False

leksi=raw_input('Δώστε μία λέξη 5 χαρακτήρων:')


y=isPalindrome(leksi)
if y==True:
print 'Είναι παλινδρομική'
else:
print 'Δεν είναι παλινδρομική'
Δραστηριότητα 2b
Μπορείτε να τροποποιήσετε την συνάρτηση της Δραστηριότητας 2a ώστε να μπορεί να
διαχειριστεί μια λέξη χωρίς περιορισμό πλήθους χαρακτήρων;

Για παράδειγμα: radar αλλά και savvas, anna ….

def isPalindrome(word): leksi=raw_input('Δώστε μία λέξη:')


N=len(word) y=isPalindrome(leksi)
Pal=True if y==True:
i=0 print 'Είναι παλινδρομική'
while i<N/2 and Pal==True: else:
if word[i]!=word[N-1-i]: print 'Δεν είναι παλινδρομική'
Pal=False
else:
i+=1
return Pal
Δραστηριότητα 2c
Μπορείτε να τροποποιήσετε την συνάρτηση της Δραστηριότητας 2b ώστε να μπορεί να
διαχειριστεί μια πρόταση αγνοώντας τα κενά;

Για παράδειγμα: ΝΙΨΟΝ ΑΝΟΜΗΜΑΤΑ ΜΗ ΜΟΝΑΝ ΟΨΙΝ …

def isPalindrome(word): protasi=raw_input('Δώστε μία πρόταση:')


result='' y=isPalindrome(protasi)
for char in word: if y==True:
if char!=' ': print 'Είναι παλινδρομική'
result+=char else:
N=len(result) print 'Δεν είναι παλινδρομική'
Pal=True
i=0
while i<N/2 and Pal==True:
if result[i]!=result[N-1-i]:
Pal=False
else:
i+=1
return Pal
Δραστηριότητα 3
Να γράψετε στην Python μία συνάρτηση με όνομα isEmail(email) η οποία θα δέχεται
μια συμβολοσειρά και θα ελέγχει αν αποτελεί ελληνική διεύθυνση ηλεκτρονικής
αλληλογραφίας (να περιέχει δηλαδή οπωσδήποτε το χαρακτήρα ‘@’ και να έχει
κατάληξη ‘.gr’).

def isEmail(email):
last3=email[-3]+email[-2]+email[-1]
papaki='@' in email
if last3=='.gr' and papaki==True:
return True
else:
return False

x=raw_input('Δώστε το email σας:')


if isEmail(x)==True:
print 'Αποτελεί ελληνική διεύθυνση email'
else:
print 'Δεν αποτελεί ελληνική διεύθυνση email'
Δραστηριότητα 4
Να γράψετε στην Python μία συνάρτηση με όνομα count_vowels(word) η οποία θα
δέχεται μια λέξη και θα μετράει και θα επιστρέφει το πλήθος των φωνηέντων (της
αγγλικής γλώσσας) της λέξης.

Για παράδειγμα: count_vowels(‘Abracadabra Python’)=7

def count_vowels(word):
vowels='AEIOUYaeiouy'
count=0
for letter in word:
if letter in vowels:
count+=1
return count

x=raw_input('Δώστε μία λέξη:')


y=count_vowels(x)
print 'Η λέξη έχει',y,'φωνήεντα'
Δραστηριότητα 5a
Να γράψετε στην Python μία συνάρτηση με όνομα mirror(num) η οποία θα δέχεται
έναν πενταψήφιο αριθμό και θα επιστρέφει τον κατοπτρικό του, για παράδειγμα
mirror(1234)=4321.

def mirror(num):
s=str(num)
mnum=int(s[4]+s[3]+s[2]+s[1]+s[0])
return mnum

x=int(input('Δώστε έναν πενταψήφιο αριθμό:'))


y=mirror(x)
print y
Δραστηριότητα 5b
Μπορείτε να τροποποιήσετε το πρόγραμμα της Δραστηριότητας 5a ώστε να μπορεί να
διαχειριστεί έναν αριθμό χωρίς περιορισμό ψηφίων;

def mirror(num):
s=str(num)
revs=''
for item in reversed(s):
revs+=item
mnum=int(revs)
return mnum

x=int(input('Δώστε έναν αριθμό:'))


y=mirror(x)
print y

You might also like