Λίστες

Σειρά στοιχείων

Μία σειρά στοιχείων (αριθμών, συμβολοσειρών κλπ) μπορούν να οργανωθούν σε μία δομή η οποία ονομάζεται λίστα. Παρδείγματα:


>>> rgb = ['red','green','blue']
>>> cities = ['Agios','Heraklion','Rethymno','Chania']
>>> digits = [0,1,2,3,4,5,6,7,8,9]

Το μήκος μίας λίστας μπορεί να βρεθεί με χρήση της συνάρτησης len:


>>> len(digits)
10

Μπορούμε να ανακτήσουμε ένα από τα στοιχεία της λίστας χρησιμοποιώντας τον δείκτη του. Η δεικτοδότηση είναι ακριβώς όπως στις συμβολοσειρές.


>>> rgb[1]
'green'
>>> rgb[-1]
'blue'

Παρατήρηση. Σημαντική διαφορά των λιστών από τις πλειάδες είναι ότι οι πρώτες είναι μεταλλάξιμες (mutable).

slicing: Μπορούμε να ανακτήσουμε ένα τμήμα της λίστας χρησιμοποιώντας ένα εύρος δεικτών. Το αποτέλεσμα είναι μία νέα λίστα.


>>> digits[1:3]
[1,2]
>>> digits[7:]
[7,8,9]

Βασικές λειτουργίες

Μπορούμε να χρησιμοποιήσουμε τα σύμβολα της πρόσθεσης (+) για λίστες:


>>> cmyk = ['cyan','magenta','yellow','black']
>>> colors = rgb + cmyk
>>> colors
['red','green','blue','cyan','magenta','yellow','black']

καθώς επίσης και του πολλαπλασιασμού (*):


>>> 2*rbg
['red','green','blue','red','green','blue']
>>> 2*[0,1]
[0,1,0,1]

Μέθοδοι

Σε μία υπάρχουσα λίστα μπορούμε να προσθέσουμε ένα στοιχείο:


>>> colours.append('white')
>>> colors
['red','green','blue','cyan','magenta','yellow','black','white']

append [λιστα.append(στοιχειο)]: Έχουμε χρησιμοποιήσει μία μέθοδο η οποία ονομάζεται append και επέδρασε στη λίστα colors. Η σύνταξη είναι λιστα.μεθοδος(ορισμα). code>ορισμα προστίθεται ως τελευταίο στοιχείο στη λιστα και η υπάρχουσα λίστα μεγαλώνει κατά ένα στοιχείο.

λιστα.remove(στοιχειο): Αφαιρεί το στοιχειο από λίστα.


Π.χ., colors.remove('white')

λιστα.pop(): Αφαιρεί το τελευταίο στοιχείο λίστας (και το επιστρέφει). Επίσης μπορούμε να αφαιρέσουμε στοιχείο με συγκεκριμένο δείκτη.


>>> colors.pop()
'white'
>>> colors
['red','green','blue','cyan','magenta','yellow', 'black']]

>>> colors.pop(1)
'green'
>>> colors
['red','blue','cyan','magenta','yellow', 'black']

Μπορούμε να ελέγξουμε αν ένα στοιχείο υπάρχει σε λίστα:


>>> 'white' in colors
False

>>> if 'white' not in colors: colors.append('white')

Παράδειγμα. Θα διατρέξουμε (σαρώσουμε) τη λίστα colors, θα αφαιρέσουμε τα χρώματα που δεν μας αρέσουν και θα προσθέσουμε ορισμένα που μας αρέσουν.


colors = ['red','green','blue','cyan','magenta','yellow','black']

colors1 = colors[:]
for c in colors1:
    yesno = input("Should I keep " + c + "? (y/n) ")
    if yesno == 'n': colors.remove(c)

while True:
    newColor = input("Should I add a new color? (color/n) ")
    if newColor != 'n':
        colors.append(newColor)
    else:
        break

print("Your new list of colors is\n",colors)

List comprehension (Υπολογιζόμενη λίστα).

Έχουμε την ακόλουθη μέθοδο δημιουργίας μιας λίστας.

comprehensionList = [εκφραση for μεταβλητη in ακολουθια]


>>> squares = [i**2 for i in range(11)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Άλλες μέθοδοι

λιστα.index(στοιχειο). Επιστρέφει το δείκτη της πρώτης παρουσίας του στοιχειο στη λιστα.

λιστα.count(στοιχειο). Επιστρέφει τον αριθμό φορών που εμφανίζεται το στοιχειο στη λιστα.

λιστα.reverse(). Αναστρέφει τη σειρά των στοιχείων στη λιστα.

λιστα.sort(). Ταξινομεί τα στοιχεία της λιστα σε αύξουσα σειρά.

λιστα.insert(i,στοιχειο). Το στοιχείο τοποθετείται στη θέση i της λιστα.

Παράδειγμα. Ας δημιουργήσουμε μία λίστα, μετά θα αντιστρέψουμε τη σειρά των στοιχείων της.


>>> L = ['a','b','c','d','e','f']
>>> L.reverse()
>>> L
['f', 'e', 'd', 'c', 'b', 'a']

Παρατήρηση. Δείτε ότι η εντολή L.reverse μεταλλάσσει την ίδια τη λίστα (και δεν δημιουργεί μία καινούρια για να βάλει το αποτέλεσμα της μεθόδου).

Παράδειγμα. Ας δημιουργήσουμε μία λίστα, μετά θα ανακατέψουμε τα στοιχεία της με τυχαίο τρόπο και τέλος θα εντοπίσουμε ένα συγκεκριμένο στοιχείο της.


import random
L = ['a','b','c','d','e','f']
random.shuffle(L)
print(L.index('a'))

Παράδειγμα. Ας βρούμε το άθροισμα των στοιχείων μίας λίστας (της οποίας τα στοιχεία είναι αριθμοί).


def sumList(L):
    summ = 0
    for num in L:
        summ += num
    return summ

L = [1,2,3,4,5,6,8,9]
print(sumList(L))

Παράδειγμα. Ας ελέγξουμε αν μία λίστα είναι παλινδρομική (δηλαδή, αν η σειρά των στοιχείων της είναι η ίδια είτε διαβάζεται από αριστερά προς τα δεξιά είτε αντίστροφα).


n = len(L)
flag = True
for i in range(0,n//2):
    if L[i] != L[n-i-1]: 
	flag = False
	break

print(flag)

Μία πιο συμπαγής συνάρτηση, η οποία χρησιμοποιεί αναδρομική κλήση, είναι η ακόλουθη.


def isPalindrome(L):
    if len(L) <= 1:
        return True
    return L[0] == L[-1] and isPalindrome(L[1:-1])

Ερώτηση. Πώς θα μπορούσαμε να ελέγξουμε αν μία λίστα είναι παλινδρομική με χρήση της μεθόδου reverse;

Ειδικότερα είδη λιστών

Παρατήρηση. Μία λίστα μπορεί να περιέχει στοιχεία διαφορετικών τύπων:


>>> exampleList = ['father',30,'son',3]

Παρατήρηση. Μία λίστα μπορεί να περιέχει λίστες:


>>> exampleList = [[1,2,3],['a','b','c']]

Παράδειγμα.

Ας βάλουμε σε μία λίστα τις άρτιες μεταθέσεις τριών αριθμών.


>>> permute = []
>>> permute.append([1,2,3])
>>> permute.append([2,3,1])
>>> permute.append([3,1,2])
>>> permute
[[1, 2, 3], [2, 3, 1], [3, 1, 2]]

Παράδειγμα.

Θα δούμε την πρόσβαση στα στοιχεία μίας λίστας L1 η οποία είναι στοιχείο άλλης λίστας L. Αυτό μπορεί να γίνει με δύο τρόπους: είτε μέσω της αρχικής λίστας L1 είτε μέσω του αντίστοιχου στοιχείου της μεγαλύτερης λίστας L.


>>> L1 = ['a','b','c']
>>> L2 = [1,2,3]
>>> L = [L1,L2]
>>> L
[['a', 'b', 'c'], [1, 2, 3]]
L1.append('d')
>>> L
[['a', 'b', 'c', 'd'], [1, 2, 3]]
>>> L[0].append('e')
>>> L
[['a', 'b', 'c', 'd', 'e'], [1, 2, 3]]
>>> L1
['a', 'b', 'c', 'd', 'e']

Έλγχος τύπου μεταβητής (isinstance())

Μπορούμε να ελέγξουμε αν μία μεταβλητή a είναι τύπου list με την εντολή isinstance(a,list) η οποία θα δώσει αποτέλεσμα True/False.

Παράδειγμα. [Πηγή: Σημειώσεις Μ. Πλεξουσάκη] Έστω L μια λίστα τα στοιχεία της οποίας μπορεί να είναι με τη σειρά τους λίστες. Για παράδειγμα, θα μπορούσαμε να έχουμε L = [1, 2, ['one', 3], [[4]], 'Maria']. Γράψτε μια συνάρτηση η οποία κατασκευάζει μια «μονοδιάστατη» λίστα, αφαιρεί δηλαδή τυχόν εσωτερικές λίστες.


def flatten(L):
    M = []
    for item in L:
        if isinstance(item, list):
            M.extend(flatten(item))
        else:
            M.append(item)
    return M

Μελέτη

Βιβλιογραφία

  1. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python (Κεφάλαιο 5).
  2. Δημήτριος Καρολίδης, Μαθαίνετε εύκολα python (Παράγραφοι 4.1, 4.2) (Εκδόσεις Καρολίδη, 2016).
  3. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Κεφάλαιο 6. Συμβολοσειρές, λίστες, πλειάδες, λεξικά.