17. Σύνολα

Μια άλλη δομή δεδομένων είναι τα σύνολα, όπου τα στοιχεία του συνόλου χωρίζονται με κόμμα και περικλείονται μέσα σε άγκιστρα. Ένα σύνολο περιέχει μοναδικά στοιχεία, τα οποία δεν είναι διατεταγμένα, δηλαδή δεν μπορούμε να τα καθορίσουμε με δείκτη. Τα σύνολα στην Python χρησιμοποιούνται για την εκτέλεση μαθηματικών πράξεων μεταξύ συνόλων, όπως είναι η τομή, η ένωση, η διαφορά κ.ά. Ένα σύνολο μπορεί να αποτελείται από διαφορετικού τύπου στοιχεία, αλλά δεν μπορεί να περιέχει στοιχεία που μεταβάλλονται όπως οι λίστες ή τα λεξικά. Το σύνολο μπορεί να είναι μεταβλητό, δηλαδή μπορούμε να προσθέσουμε ή να διαγράψουμε στοιχεία.

Ένα σύνολο μπορεί να δημιουργηθεί με κλήση της συνάρτησης set() όπως στο ακόλουθο παράδειγμα:

>>> myset=set('konstantinos')
>>> myset
   {'t', 'n', 'k', 'a', 'i', 'o', 's'}

Από το προηγούμενο παράδειγμα διαπιστώνουμε ότι, ένα σύνολο ορίζεται με άγκιστρα και τα στοιχεία που περιέχει είναι μοναδικά και μη διατεταγμένα.

Μπορούμε να δημιουργήσουμε ένα σύνολο με αναγραφή των στοιχείων του μέσα σε ένα ζευγάρι από αγκύλες. Π.χ.

>>> myset1 = {5, 6, 7, 8, 9}
>>> myset1
    {5, 6, 7, 8, 9}

Ένα σύνολο μπορεί να περιέχει μοναδικά στοιχεία διαφορετικού τύπου. Π.χ.

>>> myset2 = {'a', 23, 'cat', 56, (1, 2, 3)}
>>> myset2
   {'a', 23, 56, 'cat', (1, 2, 3)}

Ένα σύνολο δεν μπορεί να δημιουργηθεί με στοιχεία λίστας ή λεξικού, αλλιώς θα πάρουμε μήνυμα λάθους. Π.χ.

>>>myset3 = {'n', 89, [1, 2, 3]}    
   Traceback (most recent call last):    
   File "<pyshell#8>", line 1, in <module>   
   myset3 = {'n', 89, [1, 2, 3]}     
   TypeError: unhashable type: 'list'

Μπορούμε όμως, να δημιουργήσουμε ένα σύνολο που να περιέχει τα στοιχεία μιας λίστας. Π.χ.

>>> myset5 = set(['a', 5, 10, 15])
>>> myset5
   {10, 'a', 5, 15}

Ο τελεστής in μπορεί να εφαρμοστεί και σε σύνολα. Με την εφαρμογή του τελεστή in έχουμε True όταν μια τιμή υπάρχει στο σύνολο.

>>> myset7 = {'k', 'l', 'm', 'n'}
>>> 'm' in myset7
     True
>>> 'b' in myset7
     False

Ο τελεστής in όταν εφαρμόζεται σε σύνολο ψάχνει για ένα συγκεκριμένο στοιχείο. Με τη χρήση της εντολής for πάνω σε ένα σύνολο, έχει σαν αποτέλεσμα την διάσχιση όλου του συνόλου και την πρόσβαση σε όλα τα στοιχεία του.

Η συνάρτηση len() όταν εφαρμοστεί σε ένα σύνολο, δίνει το πλήθος των στοιχείων του. Π.χ.

>>> myset6 = {'k', 'l', 'm', 'n'}
>>> len(myset6)
     4

Η συνάρτηση max(s) επιστρέφει το μέγιστο στοιχείο του συνόλου s. Π.χ.

>>> myset6 = set(['c', 'da', 'se', 'cat'])
>>> max(myset6)
   'se'
>>> myset7 = set(['20', '15', '32', '85'])
>>> max(myset7)
   '85'
>>> myset8 = set(['5c', 'b5', '2', '78'])
>>> max(myset8)
   'b5'

Η συνάρτηση min(s) επιστρέφει το ελάχιστο στοιχείο του συνόλου s. Π.χ.

>>> myset6 = set(['c', 'da', 'se', 'cat'])
>>> min(myset6)
    'c'
>>> myset7 = set(['20', '15', '32', '8'])
>>> min(myset7)
   '15'
>>> myset8 = set(['5c', 'b5', '2', '78'])
>>> min(myset8)
    '2'

Η συνάρτηση sorted(s) επιστρέφει μια ταξινομημένη λίστα με τα στοιχεία του συνόλου s σε αύξουσα σειρά. Π.χ.

>>> myset9 = {'b', '9', 'a', 'l'}
>>> sorted(myset9)
   ['9', 'a', 'b', 'l']

Η συνάρτηση sum(s) επιστρέφει το άθροισμα των στοιχείων του συνόλου s. Τα στοιχεία πρέπει να είναι αριθμητικά, αλλιώς θα πάρουμε μήνυμα σφάλματος.

>>> myset10 = {5, 1, 4, 10}
>>> sum(myset10)
    20

Μέθοδοι πάνω σε σύνολα

Η μέθοδος s.clear() διαγράφει όλα τα στοιχεία του συνόλου s και επιστρέφει ένα κενό σύνολο. Π.χ.

>>> myset11 = {'k', 'l', 'm', 'n'}
>>> myset11.clear()
>>> print(myset11)
    set()

Η μέθοδος s.copy() επιστρέφει ένα αντίγραφο του συνόλου s. Π.χ.

>>> myset12 = {'k', 'l', 'm', 'n'}
>>> mysetc = myset12.copy()
>>> print(mysetc)
    {'m', 'l', 'n', 'k'}

Η μέθοδος s.difference(sa) επιστρέφει ένα σύνολο που περιέχει τα στοιχεία που υπάρχουν στο σύνολο s αλλά δεν υπάρχουν στο σύνολο sa. Π.χ.

>>> myset13 = {'1', '2', '3', '4', '5'}
>>> myset14 = {'4', '5'}
>>> setA = myset13.difference(myset14)
>>> print(setA)
    {'2', '3', '1'}

Η μέθοδος s.difference_update(sa) διαγράφει από το σύνολο s τα στοιχεία τα οποία υπάρχουν στο σύνολο sa. Π.χ.

>>> myset15 = {'1', '2', '3', '4', '5'}
>>> myset16 = {'4', '5'}
>>> myset15.difference_update(myset16)
>>> print(myset15)
    {'1', '2', '3'}

Η μέθοδος s.intersection(sa) επιστρέφει ένα σύνολο το οποίο τα στοιχεία του υπάρχουν και στα δυο σύνολα s και sa. Π.χ.

>>> myset17 = {'1', '2', '3', '4', '5'}
>>> myset18 = {'4', '5', '6', '7'}
>>> setB = myset17.intersection(myset18)
>>> print(setB)
    {'5', '4'}

Η μέθοδος  s.intersection_update(sa) διαγράφει από το σύνολο s τα στοιχεία εκείνα που δεν υπάρχουν και στα δυο σύνολα s και sa. Π.χ.

>>> myset19 = {'1', '2', '3', '4', '5'}
>>> myset20 = {'4', '5', '6', '7'}
>>> myset19.intersection_update(myset20)
>>> print(myset19)
    {'5', '4'}

Η μέθοδος s.union(sa) επιστρέφει ένα σύνολο που περιέχει όλα τα στοιχεία του συνόλου s και όλα τα στοιχεία του συνόλου sa. Τα κοινά στοιχεία των δύο συνόλων εμφανίζονται μια φορά. Π.χ.

>>> myset21 = {'1', '2', '3', '4', '5'}
>>> myset22 = {'4', '5', '6', '7'}
>>> setC = myset21.union(myset22)
>>> print(setC)
    {'6', '1', '2', '7', '5', '3', '4'}

Η μέθοδος s.update(sa) ενημερώνει το σύνολο s με τα στοιχεία του συνόλου sa. Τα στοιχεία του συνόλου s εμφανίζονται από μια φορά.

>>> myset23 = {'1', '2', '3', '4', '5'}
>>> myset24 = {'4', '5', '6', '7'}
>>> myset23.update(myset24)
>>> print(myset23)
    {'6', '1', '2', '7', '5', '3', '4'}

Η μέθοδος s.add(item) προσθέτει το στοιχείο item στο σύνολο s. Π.χ.

>>> myset25 = {'1', '2', '3', '5'}
>>> myset25.add('4')
>>> print(myset25)
    {'3', '1', '2', '5', '4'}

Η μέθοδος s.discard(item) διαγράφει το στοιχείο item από το σύνολο s. Αν το στοιχείο δεν υπάρχει δεν εμφανίζει μήνυμα λάθους. Π.χ.

>>> myset26 = {'1', '2', '3', '4'}
>>> myset26.discard('1')
>>> print(myset26)
     {'2', '3', '4'}
>>> myset27 = {'1', '2', '3', '4'}
>>> myset27.discard('8')
>>> print(myset27)
     {'2', '3', '1', '4'}

Η μέθοδος s.remove(item) διαγράφει το στοιχείο item από το σύνολο s. Αν το στοιχείο δεν υπάρχει εμφανίζει μήνυμα λάθους. Π.χ.

>>> myset28 = {'1', '2', '3', '4'}
>>> myset28.remove('2')
>>> print(myset28)
    {'3', '1', '4'}
>>> myset29 = {'1', '2', '3', '4'}
>>> myset29.remove('9')
     Traceback (most recent call last):
     File "<pyshell#14>", line 1, in <module>
     myset29.remove('9')
     KeyError: '9'

Η μέθοδος s.pop() διαγράφει τυχαία ένα στοιχείο του συνόλου s, το οποίο επιστρέφεται από την μέθοδο pop(). Π.χ.

>>> myset30 = {'1', '2', '3', '4'}
>>> myset30.pop()
   '2'
>>> myset30.pop()
   '3'
>>> myset29
   {'1', '4'}

Η μέθοδος s.isdisjoint(sa) επιστρέφει το λογικό True όταν δεν υπάρχουν κοινά στοιχεία στα σύνολα s και sa, αλλιώς αν υπάρχουν επιστρέφει False. Π.χ.

>>> myset30 = {'1', '2', '3', '4'}
>>> myset31 = {'8', '9'}
>>> myset30.isdisjoint(myset31)
   True

Η μέθοδος s.issubset(sa) επιστρέφει το λογικό True όταν τα στοιχεία του συνόλου s υπάρχουν και στο σύνολο sa, αλλιώς επιστρέφει False αν δεν υπάρχουν. Π.χ.

>>> myset32 = {'k', 'm'}
>>> myset33 = {'k', 'l', 'm', 'n'}
>>> myset32.issubset(myset33)
    True

Η μέθοδος s.issuperset(sa) επιστρέφει το λογικό True όταν τα στοιχεία του συνόλου sa υπάρχουν και στο σύνολο s, αλλιώς επιστρέφει False αν δεν υπάρχουν. Π.χ.

>>> myset34 = {'1', '2', '3', '4', '5'}
>>> myset35 = {'2', '5'}
>>> myset34.issuperset(myset35)
    True

Αμετάβλητα σύνολα

Μια άλλη δομή δεδομένων είναι τα αμετάβλητα σύνολα. Τα αμετάβλητα σύνολα είναι στην ουσία σύνολα όπου τα στοιχεία τους είναι αμετάβλητα, δηλαδή δεν μπορούν να αλλάξουν. Μπορούμε να δημιουργήσουμε ένα αμετάβλητο σύνολο με την συνάρτηση frozenset().

Στο επόμενο παράδειγμα χρησιμοποιούμε την συνάρτηση frozenset() χωρίς παραμέτρους για να δημιουργήσουμε ένα κενό αμετάβλητο σύνολο.

>>> frozenset()
    frozenset()

Αν δώσουμε ως παράμετρο στη συνάρτηση frozenset() μια ακολουθία από στοιχεία, θα δημιουργηθεί ένα αμετάβλητο σύνολο με τα ίδια στοιχεία. Π.χ.

>>> fset1 = frozenset(['a', 'b', 'c', 'd'])
>>> print(fset1)
    frozenset({'b', 'd', 'c', 'a'})

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

>>> fset2 = frozenset(['a', 'd', 'b', 'c', 'd', 'a', 'e'])
>>> print(fset2)
     frozenset({'e', 'd', 'b', 'c', 'a'})

Στο ακόλουθο παράδειγμα δημιουργούμε ένα αμετάβλητο σύνολο με στοιχεία τα γράμματα της συμβολοσειράς ‘Konstantinos’

>>> fset3 = frozenset('Konstantinos')
>>> print(fset3)
     frozenset({'K', 'n', 'i', 'o', 't', 's', 'a'})

Μέθοδοι πάνω σε αμετάβλητα σύνολα

Στα αμετάβλητα σύνολα ορίζονται οι ίδιες μέθοδοι όπως στα σύνολα, εκτός από εκείνες που προσθέτουν ή διαγράφουν στοιχεία πάνω στο σύνολο.