ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό Λίστες και Πλειάδες Χειµερινό Εξάµηνο 2014
Δοµές δεδοµένων Μια δοµή δεδοµένων είναι µια δοµηµένη (οργανωµένη) συλλογή στοιχείων (π.χ., ψηφίων, χαρακτήρων, αριθµών, αλφαριθµητικών, κλπ.). Η πιο βασική δοµή στην Python είναι η ακολουθία. Κύριοι τύποι ακολουθιών: Λίστα (list) Πλειάδα (tuple) Αλφαριθµητικό (string) Βασική διαφορά µεταξύ λιστών και άλλων ακολουθιών είναι ότι οι λίστες µπορούν να µεταβληθούν 2
Χρήση ακολουθιών Η χρήση ακολουθιών στην Python είναι εκτενής Ορίζουµε και χρησιµοποιούµε ακολουθίες όταν θέλουµε να διαχειριστούµε συλλογές δεδοµένων Π.χ. χρήση λιστών για τη δηµιουργία µιας βάσης δεδοµένων µε ονόµατα και ηλικίες προσώπων: >>>edward=['edward Gumby', 42] >>>john=['john Smith', 50] >>>database=[edward, john] >>>database [['Edward Gumby', 42], ['John Smith', 50]] 3
Λίστες Μια λίστα ορίζεται σαν ακολουθία στοιχείων, χωρισµένα από κόµµατα, εντός ενός [ και ενός ] Μια λίστα µπορεί να περιέχει στοιχεία διαφορετικών τύπων >>>edward=['edward Gumby', 42] >>>john=['john Smith', 50] λίστα από λίστες >>>database=[edward, john] >>>database [['Edward Gumby', 42], ['John Smith', 50]] 4
Προσπέλαση στοιχείων Τα στοιχεία µιας λίστας µπορούν να προσπελαστούν κατ αντιστοιχία µε την προσπέλαση χαρακτήρων σε ένα αλφαριθµητικό Το πρώτο στοιχείο στη θέση 0, το 2 ο στη θέση 1, κλπ. Επίσης: αρνητική δεικτοδότηση >>> john[0] 'John Smith' >>> database[-1] ['John Smith', 50] 5
Άλλες λειτουργίες σε λίστες >>> len(database) 2 >>> john + john ['John Smith', 50, 'John Smith', 50] >>> john + database µήκος λίστας = αριθµός στοιχείων στη λίστα συνένωση λιστών συνένωση λιστών µε διαφορετικά στοιχεία ['John Smith', 50, ['Edward Gumby', 42], ['John Smith', 50]] επαλήθευση µέλους λίστας >>> 'John Smith' in john True >>> 'John Smith' in database False γιατί;; τα µέλη της database είναι ['Edward Gumby', 42] και ['John Smith', 50] 6
Άλλες λειτουργίες σε λίστες >>> 3 * john ['John Smith', 50, 'John Smith', 50, 'John Smith', 50] >>> lst = [23.99, 19.99, 34.50, 120.99] >>> min(lst) 19.99 >>> max(lst) 120.99 >>> sum(lst) 199.46999999999997 7
Άσκηση Δίνεται µια λίστα µε λέξεις. Βρες τη µικρότερη και τη µεγαλύτερη λέξη (σε λεξικογραφική σειρά) >>> words = ['bat', 'ball', 'barn', 'basket', 'badmington'] >>> min(words) 'badmington' >>> max(words) 'bat' 8
Κατάτµηση λιστών Κατάτµηση (slicing): Ένα τµήµα µιας λίστας ορίζεται µε ένα διάστηµα θέσεων [x:y] σε αυτή Το x είναι η θέση του πρώτου στοιχείου και το y η εποµένη της θέσης του τελευταίου που θέλουµε >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> letters[3:6] ['d', 'e', 'f'] >>> letters[-3:-1] µη έγκυρο διάστηµα ['h', 'i'] >>> letters[-3:0] [] 9
Κατάτµηση λιστών To διάστηµα θέσεων [x:y] µπορεί να έχει ένα ή και κανένα όριο Π.χ. αν δεν προσδιορίσουµε το πάνω όριο, τότε εννοείται ότι θέλουµε µεχρι το τελευταίο στοιχείο >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> letters[-3:] ['h', 'i', 'j'] >>> letters[:5] ['a', 'b', 'c', 'd', 'e'] >>> letters[:] ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 10
Άσκηση Δίνεται µια διαδικτυακή διεύθυνση (URL) του τύπου http://www.something.com Ζητείται να υπολογίσουµε το domain (something) # Split up a URL of the form http://www.something.com url = input('please enter the URL: ') postfix = url[11:] domain = postfix[:-4] print("domain name: ", domain) Please enter the URL: http://www.python.org Domain name: python 11
Βήµα Στo διάστηµα θέσεων [x:y] µπορούµε να ορίσουµε έναν τρίτο αριθµό (βήµα) ορίζει για καθε πόσα στοιχεία θα παίρνουµε ένα >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> letters[0:7:2] ['a', 'c', 'e', 'g'] >>> letters[1::2] ['b', 'd', 'f', 'h', 'j'] >>> letters[::3] ['a', 'd', 'g', 'j'] αρνητικό βήµα >>> letters[8:4:-2] ['i', 'g'] 12
Δηµιουργία λίστας από αλφαριθµητικό Η συνάρτηση list() προσφέρει έναν γρήγορο τρόπο δηµιουργίας λίστας χαρακτήρων >>> list('hello') ['H', 'e', 'l', 'l', 'o'] >>> x=list('hello') >>> x ['H', 'e', 'l', 'l', 'o'] 13
Αλλαγή στοιχείων λίστας Μπορούµε να προσπελάσουµε και να αλλάξουµε ένα στοιχείο λίστας µε την χρήση δείκτη Μπορούµε να σβήσουµε ένα στοιχείο λίστας >>> x=list('hello') >>> x ['H', 'e', 'l', 'l', 'o'] >>> x[3]='p' >>> x ['H', 'e', 'l', 'p', 'o'] >>> del x[4] >>> x ['H', 'e', 'l', 'p'] 14
Αλλά... >>> x= 'Hello >>> x 'Hello' >>> x[3] = 'p' Traceback (most recent call last): File "<pyshell#72>", line 1, in <module> x[3] = 'p' TypeError: 'str' object does not support item assignment Στα αλφαριθµητικά (όπως και στις πλειάδες) δεν µπορούµε να κάνουµε αλλαγές! 15
Αλλαγή τµηµάτων λίστας Μπορούµε να αλλάξουµε ολόκληρα τµήµατα λιστών µε χρήση slicing >>> name = list('perl') >>> name ['P', 'e', 'r', 'l'] >>> name[2:] = list('ar') >>> name ['P', 'e', 'a', 'r'] >>> name[1:] = list('ython') >>> name ['P', 'y', 't', 'h', 'o', 'n'] αλλαγή στοιχείων και επέκταση της λίστας ταυτόχρονα 16
Αλλαγή τµηµάτων λίστας Μπορούµε να αλλάξουµε ολόκληρα τµήµατα λιστών µε χρήση slicing >>> numbers = [1, 5] >>> numbers[1:1] = [2, 3, 4] >>> numbers [1, 2, 3, 4, 5] >>> numbers[1:4] = [] >>> numbers [1, 5] εισαγωγή στοιχείων χωρίς να διαγράψουµε τα υπάρχοντα διαγραφή στοιχείων µέσα στο διάστηµα θέσεων 17
Μέθοδοι λίστών (append) Μπορούµε να προσθέσουµε ένα στοιχείο στο τέλος της λίστας µε τη µέθοδο append Μέθοδος: συνάρτηση που καλείται µέσα από ένα αντικείµενο >>> x = list('hello') >>> x ['H', 'e', 'l', 'l', 'o'] >>> x.append('p') >>> x ['H', 'e', 'l', 'l', 'o', 'p'] >>> x.append('pow') >>> x ['H', 'e', 'l', 'l', 'o', 'p', 'pow'] η λίστα είναι αντικείµενο η append είναι µέθοδος λιστών µπορούµε να προσθέσουµε οποιουδήποτε τύπου στοιχεία σε µια λίστα 18
Μέθοδοι λίστών (count) Μπορούµε να µετρήσουµε το πλήθος των στοιχείων µιας λίστας που έχουν µια συγκεκριµένη τιµή µε τη µέθοδο count >>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] >>> x.count(1) 2 >>> x.count([1,2]) 1 >>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to') 2 19
Μέθοδοι λίστών (extend) Πολλαπλά στοιχεία προστίθενται σε µια λίστα µε τη µέθοδο extend >>> a = [1, 2, 3] >>> b = a >>> a.extend(b) >>> a [1, 2, 3, 1, 2, 3] To a.extend(b) είναι ισοδύναµο µε το a[len(a):]=b 20
Μέθοδοι λίστών (pop) Η µέθοδος pop υπολογίζει ένα στοιχείο της λίστας και ταυτόχρονα το διαγράφει από αυτή >>> x = [1, 2, 3] >>> x.pop() 3 >>> x [1, 2] >>> x.pop(0) 1 >>> x [2] αν δεν προσδιορίσουµε τη θέση του στοιχείου η pop θεωρεί ότι θέλουµε το τελευταίο στοιχείο από τη λίστα 21
Μέθοδοι λίστών (index) Μπορούµε να ψάξουµε για την πρώτη εµφάνιση ενός στοιχείου µε τη µέθοδο index >>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni'] >>> knights.index('who') 4 >>> knights.index('herring') Traceback (most recent call last): File "<pyshell#123>", line 1, in <module> knights.index('herring') ValueError: 'herring' is not in list 22
Μέθοδοι λίστών (reverse) Η µέθοδος reverse αντιστρέφει τη σειρά των στοιχείων της λίστας >>> x=[1,2,3] >>> x.reverse() >>> x [3, 2, 1] >>> x=[1,2,3] >>> y=list(reversed(x)) >>> y [3, 2, 1] >>> x [1, 2, 3] reversed(x): επιστρέφει τα στοιχεία της λίστας x σε αντίστροφη σειρά χωρίς να αντιστρέφει την ίδια τη λίστα x 23
Μέθοδοι λίστών (sort) Η µέθοδος sort ταξινοµεί τη λίστα, βάζοντας τα στοιχεία της σε αυξουσα σειρα >>> x = [4, 6, 2, 1, 7, 9] >>> x.sort() >>> x [1, 2, 4, 6, 7, 9] 24
Μέθοδοι λίστών (sort) Άσκηση: Θέλουµε να αρχικοποιήσουµε µια νέα λίστα µε τα περιεχόµενα της x ταξινοµηµένα, χωρίς να πειράξουµε τη x >>> x = [4, 6, 2, 1, 7, 9] >>> y=x >>> y.sort() >>> y [1, 2, 4, 6, 7, 9] >>> x [1, 2, 4, 6, 7, 9] λάθος τρόπος: το πρόβληµα είναι ότι το y αναφέρεται στην ίδια λίστα µε το x (το y δεν είναι αντιγραφή του x) 25
Μέθοδοι λίστών (sort) Άσκηση: Θέλουµε να αρχικοποιήσουµε µια νέα λίστα µε τα περιεχόµενα της x ταξινοµηµένα, χωρίς να πειράξουµε τη x >>> x = [4, 6, 2, 1, 7, 9] >>> y=x[:] >>> y.sort() >>> y [1, 2, 4, 6, 7, 9] >>> x [4, 6, 2, 1, 7, 9] σωστός τρόπος αντιγραφής λίστας εναλλακτικά: y = list(x) y.sort() y = sorted(x) 26
Αντίστροφη ταξινόµηση Άσκηση: Ταξινόµησε τη λίστα x τοποθετώντας τα στοιχεία από το µεγαλύτερο στο µικρότερο >>> x = [4, 6, 2, 1, 7, 9] >>> x.sort() >>> x.reverse() >>> x [9, 7, 6, 4, 2, 1] Αλλιώς: x.sort(reverse=true) Μεγάλη γκάµα δυνατοτήτων ταξινόµησης στην Python: http://wiki.python.org/moin/howto/sorting 27
Μεταβλητές (ξανά!) Γενικά µια µεταβλητή αναφέρεται σε ένα αντικείµενο (αριθµός, αλφαριθµητικό, λίστα, κλπ.) >>> x = 5 >>> lst = [1,2,3,4] x lst 5 [1,2,3,4] 28
Μεταβλητές (ξανά!) Υπάρχουν δύο τύποι αντικειµένων: µεταβαλλόµενα και µη µεταβαλλόµενα µεταβαλλόµενα: λίστες µή µεταβαλλόµενα: αριθµοί, αλφαριθµητικά, πλειάδες >>> x = 5 >>> lst = [1,2,3,4] x lst 5 [1,2,3,4] 29
Μεταβλητές (ξανά!) Ο µόνος τρόπος να αλλάξουµε ένα µη µεταβαλλόµενο αντικείµενο είναι να ορίσουµε ένα νέο αντικείµενο για τη µεταβλητή µας >>> x = 7 x lst 5 7 [1,2,3,4] 30
Μεταβλητές (ξανά!) Αντίθετα, µπορούµε να αλλάξουµε ένα µεταβαλλόµενο αντικείµενο, χωρίς να χρειαστεί να ορίσουµε νέο >>> lst[2] = 7 lst [1,2,3,4] 7 31
Μεταβλητές (ξανά!) Αν εξισώσουµε 2 µεταβλητές, αυτές θα αναφέρονται στο ίδιο αντικείµενο. Αν το αντικείµενο είναι µεταβαλλόµενο και αλλάξει, οι τιµές και των δύο µεταβλητών αλλάζουν >>> lst = [1,2,3,4] >>> lstnew = lst >>> lst[2] = 7 >>> lstnew [1, 2, 7, 4] lst lstnew [1,2,3,4] 7 32
Μεταβλητές (ξανά!) Αν εξισώσουµε 2 µεταβλητές, αυτές θα αναφέρονται στο ίδιο αντικείµενο. Αν το αντικείµενο είναι µη µεταβαλλόµενο και αλλάξουµε τη µία µεταβλητή, τότε αυτή θα αναφέρεται σε άλλο αντικείµενο >>> x = 5 >>> y = x y x >>> x = 7 >>> y 5 5 7 33
Μέθοδοι λίστών Οι λίστες είναι η κύρια δοµή δεδοµένων στην Python. Υποστηρίζονται από µεγάλο αριθµό µεθόδων >>> help(list) Help on class list in module builtins: class list(object) list() -> new empty list list(iterable) -> new list initialized from iterable's items Methods defined here: 34
Πλειάδες Οι πλειάδες (tuples) είναι ακολουθίες, όπως οι λίστες, οι οποίες όµως δεν µπορούν να αλλαχθούν Το ίδιο ισχύει και για τα αλφαριθµητικά (strings) >>> x=1,2,3 >>> x (1, 2, 3) >>> x[2] 3 >>> x[2] = 5 Traceback (most recent call last): File "<pyshell#212>", line 1, in <module> x[2] = 5 TypeError: 'tuple' object does not support item assignment 35
Πλειάδες - αρχικοποίηση >>> x = 1, >>> x (1,) >>> x = tuple([1]) >>> x (1,) >>> tuple([1, 2, 3]) (1, 2, 3) >>> tuple('abc') ('a', 'b', 'c') >>> tuple((1, 2, 3)) (1, 2, 3) >>> z = tuple() >>> z () το κόµµα στο τέλος υπονοεί πλειάδα µε ένα στοιχείο x = 1 (χωρίς κόµµα) ορίζει οτί το x είναι ακέραιος αριθµός και όχι πλειάδα! 36
Λειτουργίες σε Πλειάδες Ακριβώς όπως οι λειτουργίες σε λίστες (π.χ. slicing) Διαφορές Οι πλειάδες δεν µπορούν να αλλαχθούν Οι πλειάδες δεν έχουν όλες τις µεθοδους λιστών συγκεκριµένα: δεν έχουν τις µεθόδους που αλλάζουν τις λίστες >>> x=1,2,3 >>> x[:2] (1, 2) >>> x.count(2) 1 >>> x.index(3) 2 >>> x.sort() Traceback (most recent call last): File "<pyshell#209>", line 1, in <module> x.sort() AttributeError: 'tuple' object has no attribute 'sort' 37
Γιατί πλειάδες; Αφου οι πλειάδες έχουν περιορισµένη λειτουργικότητα σε σχέση µε τις λίστες, γιατί τις χρησιµοποιούµε; Κάποιες λειτουργίες που θα δούµε αργότερα (π.χ. κλειδιά σε λεξικό) υποστηρίζοντα µε πλειάδες Κάποιες συναρτήσεις επιστρέφουν το αποτέλεσµά τους σε µορφή πλειάδων, οπότε πρέπει να ξέρουµε πως να τις χειριστούµε Στη γενική περίπτωση στα προγράµµατα χρησιµοποιούµε λίστες αντί για πλειάδες 38