Διάλεξη 9ης Νοεμβρίου 2016

Πλειάδες (tuples) και Λίστες

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

Πλειάδες

Οι πλειάδες, όπως και οι συμβολοσειρές είναι ακολουθίες στοιχείων, όχι απαραίτητα χαρακτήρων αλλά οποιοδήποτε τύπου. Επιπλέον, δεν είναι απαραίτητο τα στοιχεία μιας πλειάδας να έχουν όλα τον ίδιο τύπο. Για να δηλώσουμε μια πλειάδα, απαριθμούμε τα στοιχεία της μέσα σε παρενθέσεις, όπως για παράδειγμα, t = (1, 2, 'three'). Οι πλειάδες μπορούν να ενωθούν ή να "τεμαχιστούν" (slice) όπως και οι ακολουθίες χαρακτήρων, χρησιμοποιώντας τον ίδιο συμβολισμό. Όμως, όπως και στις συμβολοσειρές, δεν επιτρέπεται να αλλάξουμε, εκ των υστέρων, τα στοιχεία μιας πλειάδας.


>>> t1 = (1, 2, 'three')
>>> print(t1)
(1, 2, 'three')
>>> t2 = (4, 5)
>>> t = t1 + t2
>>> print(t)
(1, 2, 'three', 4, 5)
>>> t[1:3]
(2, 'three')
>>> t3 = (t1, t2)
>>> print(t3)
((1, 2, 'three'), (4, 5))
>>> student = ('Maria', 'Papadaki', 9999)
>>> student[2] = 9998
Traceback (most recent call last):
  File "<stdin>", line 1, in 
TypeError: 'tuple' object does not support item assignment

Κατ' εξαίρεση, για να δηλώσουμε μια πλειάδα με ένα μόνο στοιχείο γράφουμε, για παράδειγμα t4 = (6,). Μπορούμε να επεξεργαστούμε ένα-ένα τα στοιχεία μιας πλειάδας χρησιμοποιώντας την εντολή ανακύκλωσης for. Το παρακάτω παράδειγμα κατασκευάζει την πλειάδα των κοινών διαιρετών δύο θετικών ακεραίων:


def commonDivisors(n1, n2):
    divisors = ()
    for i in range(1, min(n1,n2)+1):
        if n1%i == 0 and n2%i == 0:
            divisors += (i,)
    return divisors

# Let us find the common divisors of 132 and 288

divisors = commonDivisors(132, 288)
print(divisors)
summ = 0
for d in divisors:
    summ += d
print('The sum of the common divisors of 132 and 288 is', summ)

Αν γνωρίζουμε τον αριθμό των στοιχείων μιας πλειάδας τότε αυτή μπορεί να συμμετέχει σε μια πολλαπλή ανάθεση, όπως για παράδειγμα x, y = (1, 2), ή στο πρόγραμμα που ακολουθεί:


def extremeDivisors(n1,n2):
    minDiv, maxDiv = None, None
    for i in range(2, min(n1,n2)+1):
        if n1%i == 0 and n2%i == 0:
            if minDiv == None or i < minDiv:
                minDiv = i
            if maxDiv == None or i > maxDiv:
                maxDiv = i
    return (minDiv, maxDiv)

# Let us find the min and max common divisors of 132 and 288

minDiv, maxDiv = extremeDivisors(132,288)

Λίστες (lists)

Η λίστα είναι μια ακολουθία στοιχείων, στην οποία κάθε στοιχείο αναγνωρίζεται από τον δείκτη του (index). Δηλώνουμε ένα αντικείμενο τύπου list απαρθμώντας τα στοιχεία του μέσα σε τετραγωνικές παρενθέσεις. Η κενή λίστα δηλώνεται ως [] ενώ η λίστα με ένα μόνο στοιχείο, π.χ. τον ακέραιο 1 είναι η [1]. Τα στοιχεία της λίστας απαριθμούνται ξεκινώντας από το μηδέν. Οι τρόποι "τεμαχισμού" (slicing) που είδαμε στις ακολουθίες χαρακτήρων και πλειάδες χρησιμοποιούν τον ίδιο συμβολισμό.


>>> L = []
>>> L = [1, 2, 'three']
>>> print(L)
[1, 2, 'three']
>>> L[2]
'three'
>>> L += [4]
>>> L[1:3]
[2, 'three']

Η σημαντική διαφορά με τις πλειάδες είναι ότι τα στοιχεία μιας λίστας είναι μεταλλάξιμα (mutable), δηλαδή μπορούν να τροποποιηθούν και μετά τη δημιουργία της.


L = [1, 2, 3, 4, 5]
for i in range(len(L)):
    L[i] **= 2

Ένας σημαντικός τρόπος κατασκευής ή επέκτασης/ενημέρωσης μιας λίστας είναι η μέθοδος append:


hwk = []
while True:
    grade = input('Enter your homework grade (null to end): ')
    if not grade: break
    hwk.append(float(grade))

print('You entered', len(hwk), 'homework grades:', L)

Το αποτέλεσμα της χρήσης της μεθόδου append είναι η επέκταση της αρχικά κενής λίστας hwk με τον βαθμό που εισάγει ο χρήστης. Σε αντίθεση με την μέθοδο append, η μέθοδος pop διαγράφει το τελευταίο στοιχείο μιας λίστας. Συγκεκριμένα στοιχεία μιας λίστας μπορεί να αφαιρεθούν με την μέθοδο remove, ενώ είναι δυνατόν να τοποθετήσουμε ένα στοιχείο σε μια συγκεκριμένη θέση με την μέθοδο insert. Οι λίστες μπορεί να περιέχουν στοιχεία τα οποία είναι και αυτά λίστες:


>>> L1 = [1, 2, 3]
>>> L2 = [4, 5, 6]
>>> L3 = L1 + L2
>>> print('L3 =', L3)
L3 = [1, 2, 3, 4, 5, 6]
>>> L1.append(L2)
>>> print('L1 =', L1)
L1 = [1, 2, 3, [4, 5, 6]]
>>> L1.extend(L2)
>>> print('L1 =', L1)
L1 = [1, 2, 3, 4, 5, 6]
>>> L1.pop()
6
>>> print('L1 =', L1)
L1 = [1, 2, 3, 4, 5]
>>> L1.remove(3)
>>> print('L1 =', L1)
L1 = [1, 2, 4, 5]
>>> L1.insert(1, 'Maria')
>>> print('L1 =', L1)
L1 = [1, 'Maria', 2, 4, 5]

Συνοψίζουμε μερικές χρήσιμες μεθόδους για λίστες: