INTRODUCTION
Στη σημερινή ενότητα των δωρεάν μαθημάτων Python, θα αναλύσουμε τόσο θεωρητικά όσο και πρακτικά την έννοια των Sets (Συνόλων), καθώς και των Frozensets που αποτελούν παράγωγό τους. Θα εξετάσουμε τις διαθέσιμες μεθόδους για την αποτελεσματική διαχείριση των στοιχείων τους, ενώ παράλληλα θα επισημάνουμε τις βασικές τους διαφορές από τις λίστες (lists) και τα λεξικά (dictionaries), ώστε να γνωρίζετε πότε είναι η κατάλληλη στιγμή να τα χρησιμοποιήσετε στον κώδικά σας.
Πώς να ορίσετε ένα Set
Τα Sets μοιράζονται ορισμένα κοινά χαρακτηριστικά με τις λίστες (Lists) και τα λεξικά (Dictionaries), αλλά διατηρούν μια εντελώς ξεχωριστή συμπεριφορά.
Όπως και οι λίστες, αποτελούν συλλογές δεδομένων. Ωστόσο, τα Sets είναι μη διατεταγμένες συλλογές (unordered collections). Αυτό σημαίνει ότι τα δεδομένα δεν αποθηκεύονται με κάποια συγκεκριμένη σειρά και, συνεπώς, δεν υποστηρίζουν αρίθμηση δείκτη (index). Δεν μπορούμε, δηλαδή, να ζητήσουμε το πρώτο ή το δεύτερο στοιχείο ενός Set. Αντίθετα, η δομή τους βασίζεται στην ίδια τεχνολογία κατακερματισμού (hashing) που χρησιμοποιούν τα κλειδιά (keys) των Dictionaries, γεγονός που κάνει την αναζήτηση στοιχείων μέσα σε αυτά αστραπιαία.
Το πιο καθοριστικό χαρακτηριστικό των Sets είναι η μοναδικότητα. Δεν επιτρέπεται να υπάρχουν στοιχεία με την ίδια ακριβώς τιμή μέσα στο ίδιο Set. Αν προσπαθήσετε να προσθέσετε ένα στοιχείο που υπάρχει ήδη, η Python απλώς θα το αγνοήσει. Επίσης, όπως συμβαίνει και στις λίστες, ένα Set μπορεί να περιέχει ταυτόχρονα διαφορετικούς τύπους δεδομένων (π.χ. strings, integers, booleans).
Δημιουργώντας ένα Set στην πράξη Υπάρχουν δύο βασικοί τρόποι για να ορίσουμε ένα Set:
- Χρήση άγκιστρων (curly brackets
{}): Μπορούμε να περικλείσουμε τα δεδομένα μας μέσα σε άγκιστρα, χωρίζοντάς τα με κόμμα. - Χρήση της συνάρτησης
set(): Ιδανική όταν θέλουμε να μετατρέψουμε μια άλλη δομή (π.χ. μια λίστα) σε Set για να αφαιρέσουμε τα διπλότυπα.
💡 Σημαντικό Tip: Αν θέλετε να δημιουργήσετε ένα εντελώς άδειο Set, πρέπει να χρησιμοποιήσετε υποχρεωτικά τη συνάρτησηset(). Αν γράψετε απλώς{}, η Python θα δημιουργήσει ένα άδειο Dictionary!
app.py
my_set = set({'Arsenal', 'Aston Villa'})print(type(my_set))print(my_set)
Output
Απευθείας Δημιουργία με Άγκιστρα (Curly Brackets)
Εναλλακτικά, όταν γνωρίζουμε εκ των προτέρων τα στοιχεία που θέλουμε να περιλάβουμε, μπορούμε να παραλείψουμε εντελώς τη χρήση της συνάρτησης set(). Η Python μας επιτρέπει να ορίσουμε ένα Set γρήγορα και πιο κομψά, τοποθετώντας τις τιμές μας απευθείας μέσα σε άγκιστρα ({ }). Αυτή η προσέγγιση είναι και η πιο διαδεδομένη όταν θέλουμε να αρχικοποιήσουμε ένα σύνολο που περιέχει ήδη δεδομένα.
app.py
my_set = {'Arsenal', 'Aston Villa'}print(type(my_set))print(my_set)
Output
Εξερευνώντας τις Μεθόδους (Methods) των Sets
Ένα από τα πιο ισχυρά χαρακτηριστικά της Python είναι ότι μας επιτρέπει να εξερευνούμε τις δυνατότητές της απευθείας μέσα από τον κώδικα. Αν θέλετε να ανακαλύψετε όλες τις διαθέσιμες μεθόδους που υποστηρίζει ένα αντικείμενο —στην προκειμένη περίπτωση, τα Sets— ο πιο γρήγορος και αξιόπιστος τρόπος είναι να χρησιμοποιήσετε την ενσωματωμένη συνάρτηση dir().
Η dir() λειτουργεί σαν ένας "φάκος" που φωτίζει όλα τα διαθέσιμα εργαλεία (μεθόδους και ιδιότητες) που συνοδεύουν το αντικείμενο που εξετάζουμε.
app.py
my_set = {'Arsenal', 'Aston Villa'}print(dir(my_set))
Output
Η Συνάρτηση help(): Το Ενσωματωμένο Εγχειρίδιο της Python
Αφού εντοπίσετε τις διαθέσιμες μεθόδους με τη dir(), το αμέσως επόμενο λογικό βήμα είναι να κατανοήσετε πώς ακριβώς λειτουργεί η καθεμία. Αντί να αναζητάτε την απάντηση στο διαδίκτυο, η Python σας προσφέρει τη λύση απευθείας στο περιβάλλον που γράφετε κώδικα, μέσω της ενσωματωμένης συνάρτησης help().
Περνώντας μια συγκεκριμένη μέθοδο μέσα στην help(), λαμβάνετε την επίσημη τεκμηρίωση (documentation) της Python. Αυτή περιλαμβάνει μια σύντομη περιγραφή του τι κάνει η μέθοδος, ποιες παραμέτρους δέχεται (αν δέχεται) και τι είδους δεδομένα επιστρέφει.
app.py
my_set = {'Arsenal', 'Aston Villa'}help(my_set.add)
Output
Εφαρμόζοντας τις Μεθόδους στην Πράξη
💡 Σημείωση: Αξίζει να αναφέρουμε ότι οι ενσωματωμένες συναρτήσειςdir()καιhelp()που μόλις είδαμε δεν περιορίζονται μόνο στα Sets. Μπορείτε να τις καλέσετε σε οποιοδήποτε αντικείμενο της Python, όπως σε λίστες (lists) ή λεξικά (dictionaries), για να αντλήσετε πολύτιμες πληροφορίες για τις δυνατότητές τους.
Τώρα που γνωρίζουμε πώς να ανακαλύπτουμε και να διαβάζουμε για τις διαθέσιμες μεθόδους ενός Set, ας δούμε πώς εφαρμόζονται ορισμένες από τις πιο βασικές σε ένα πρακτικό σενάριο.
Στο παρακάτω παράδειγμα, θα δημιουργήσουμε ένα σύνολο με αθλητικές ομάδες. Δώστε ιδιαίτερη προσοχή στο βήμα όπου προσπαθούμε να προσθέσουμε την ίδια ομάδα για δεύτερη φορά. Όπως θα διαπιστώσετε, το Set θα απορρίψει σιωπηλά τη δεύτερη καταχώρηση, διατηρώντας ακέραιο τον κανόνα της μοναδικότητας των δεδομένων του.
app.py
premier_league = {'Arsenal', 'Burnley', 'Everton', 'Aston Villa'}print(premier_league)
premier_league.add('Liverpool')premier_league.add('Liverpool')print(premier_league)
premier_league.remove('Liverpool')print(premier_league)
premier_league.clear()print(premier_league)Output
remove() εναντίον discard(): Μια Κρίσιμη Διαφορά
Παρόλο που και οι δύο αυτές μέθοδοι εξυπηρετούν τον ίδιο ακριβώς σκοπό —την αφαίρεση ενός στοιχείου από ένα Set— υπάρχει μια θεμελιώδης διαφορά στη συμπεριφορά τους. Η κατανόηση αυτής της διαφοράς είναι κρίσιμη για να αποφύγετε τα απρόσμενα "κρασαρίσματα" (bugs) στον κώδικά σας.
- Η μέθοδος
remove()είναι αυστηρή: Αν προσπαθήσετε να διαγράψετε ένα στοιχείο που δεν υπάρχει στο σύνολο, η Python θα διακόψει την εκτέλεση του προγράμματος και θα πετάξει σφάλμα (KeyError). - Η μέθοδος
discard()είναι ελαστική: Αν ζητήσετε τη διαγραφή ενός ανύπαρκτου στοιχείου, η Python απλώς θα αγνοήσει την εντολή σιωπηλά. Το πρόγραμμα θα συνεχίσει την εκτέλεσή του κανονικά, χωρίς να παραχθεί κανένα σφάλμα.
Ας το δούμε στην πράξη:
app.py
premier_league = {'Arsenal', 'Burnley', 'Everton', 'Aston Villa'}premier_league.remove('Chelsea')
Output
app.py
premier_league = {'Arsenal', 'Burnley', 'Everton', 'Aston Villa'}premier_league.discard('Chelsea')
Output
Χρήση των for, in και not in στα Sets
Όπως ακριβώς έχουμε δει και στις προηγούμενες δομές δεδομένων που αναλύσαμε (όπως οι λίστες και τα λεξικά), έτσι και στα Sets μπορούμε να διατρέξουμε (iterate) τα στοιχεία τους χρησιμοποιώντας έναν βρόχο επανάληψης for. Αυτή η διαδικασία μας επιτρέπει να προσπελάσουμε το κάθε δεδομένο ξεχωριστά και να εκτελέσουμε ενέργειες πάνω του.
💡 Σημαντική Υπενθύμιση: Επειδή τα Sets είναι μη διατεταγμένες συλλογές (unordered), η σειρά με την οποία θα εμφανιστούν τα στοιχεία κατά τη διάρκεια τουforloop είναι πρακτικά τυχαία και ενδέχεται να διαφέρει από τη σειρά με την οποία τα αρχικοποιήσατε.
app.py
premier_league = {'Arsenal', 'Burnley', 'Everton', 'Aston Villa'}for team in premier_league:print(team)
Output
Ακολουθώντας την ίδια φυσική και ευανάγνωστη λογική που συναντάμε και σε άλλες δομές της Python, μπορούμε να χρησιμοποιήσουμε τους τελεστές in και not in για να ελέγξουμε αν ένα συγκεκριμένο στοιχείο ανήκει ή όχι στο Set μας.
Εδώ, όμως, κρύβεται ίσως το μεγαλύτερο πλεονέκτημα των Sets έναντι των λιστών: η ταχύτητα αναζήτησης. Όταν χρησιμοποιείτε τον τελεστή in σε μια λίστα, η Python αναγκάζεται να ελέγξει ένα-ένα τα στοιχεία από την αρχή μέχρι να βρει αυτό που ψάχνετε. Στα Sets, χάρη στην τεχνολογία του κατακερματισμού (hashing) που αναφέραμε νωρίτερα, η Python "γνωρίζει" ακαριαία αν το στοιχείο υπάρχει ή όχι. Αυτό σημαίνει ότι ο έλεγχος γίνεται το ίδιο αστραπιαία, είτε το Set σας έχει δέκα στοιχεία, είτε ένα εκατομμύριο!
app.py
premier_league = {'Arsenal', 'Burnley', 'Everton', 'Aston Villa'}if "Arsenal" in premier_league:print("This team belongs to Premier League")else:print("Try harder next year")
Output
Η Πραγματική Δύναμη των Sets: Μαθηματικές Πράξεις
Αναφέραμε νωρίτερα ότι τα Sets μοιάζουν με τις λίστες και τα λεξικά, αλλά ξεχωρίζουν χάρη στη μοναδικότητα των στοιχείων τους και την αστραπιαία ταχύτητα αναζήτησης. Υπάρχει, όμως, ένας ακόμη κρίσιμος λόγος για να τα επιλέξετε έναντι άλλων δομών: τα Sets της Python αποτελούν την προγραμματιστική υλοποίηση των μαθηματικών συνόλων της Άλγεβρας.
Αυτό πρακτικά σημαίνει ότι μας δίνουν τη δυνατότητα να εκτελέσουμε πανεύκολα πράξεις μεταξύ δύο ή περισσότερων συλλογών δεδομένων, οι οποίες διαφορετικά θα απαιτούσαν πολύπλοκα for loops. Ας δούμε δύο από τις πιο θεμελιώδεις μεθόδους:
- Η μέθοδος
intersection()(Τομή): Συγκρίνει δύο σύνολα και επιστρέφει ένα νέο Set που περιέχει μόνο τα κοινά τους στοιχεία. - Η μέθοδος
union()(Ένωση): Συγχωνεύει δύο σύνολα και επιστρέφει ένα νέο Set με όλα τα στοιχεία τους. Επειδή μιλάμε για Sets, οποιοδήποτε στοιχείο υπήρχε και στις δύο αρχικές συλλογές, στο νέο σύνολο θα εμφανιστεί φυσικά μόνο μία φορά (αφαίρεση διπλοτύπων).
app.py
teama = {'Arsenal', 'Burnley', 'Everton', 'Aston Villa'}teamb = {'Chelsea', 'Arsenal', 'Liverpool', 'Everton'}all_teams = teama.union(teamb)print(all_teams)common_teams = teama.intersection(teamb)print(common_teams)
Output
Συνδυάζοντας Sets με Λίστες: Το "Κόλπο" της Αφαίρεσης Διπλοτύπων
Επειδή, όπως είδαμε, τα Sets από τη φύση τους αποθηκεύουν αποκλειστικά μοναδικά στοιχεία, μπορούμε να εκμεταλλευτούμε αυτή τους την ιδιότητα για να επιλύσουμε ένα πολύ συχνό πρόβλημα: την εκκαθάριση μιας λίστας από διπλότυπες εγγραφές. Η τεχνική είναι εξαιρετικά απλή και κομψή: μετατρέπουμε τη λίστα σε Set και αμέσως μετά την επαναφέρουμε σε μορφή λίστας.
Φανταστείτε ένα ρεαλιστικό σενάριο: Έχετε μόλις αντλήσει εκατοντάδες χιλιάδες εγγραφές (π.χ. διευθύνσεις email) από μια βάση δεδομένων και θέλετε να κρατήσετε μόνο τις μοναδικές. Αν προσπαθούσατε να το κάνετε αυτό παραδοσιακά, φτιάχνοντας ένα for loop που θα ελέγχει ένα-ένα τα στοιχεία, ο κώδικάς σας θα αργούσε χαρακτηριστικά. Αντίθετα, η μετατροπή μέσω Set εκτελείται σε κλάσματα του δευτερολέπτου, εξοικονομώντας σας πολύτιμο χρόνο εκτέλεσης.
app.py
teams = ['Arsenal', 'Burnley', 'Everton', 'Aston Villa', 'Arsenal']unique_teams = (list(set(teams)))print(unique_teams)
Output
Το Frozenset: Η "Παγωμένη" Εκδοχή των Sets
Πριν ολοκληρώσουμε το σημερινό μας δωρεάν μάθημα Python, είναι σημαντικό να γνωρίσετε μια ειδική και πολύ χρήσιμη παραλλαγή των συνόλων που ενδέχεται να συναντήσετε: τα Frozensets.
Στην ουσία, ένα Frozenset διαθέτει ακριβώς τα ίδια χαρακτηριστικά με ένα απλό Set (είναι μη διατεταγμένο - unordered και περιέχει μόνο μοναδικά στοιχεία - unique). Η ειδοποιός διαφορά του, ωστόσο, είναι ότι πρόκειται για μια δομή immutable (αμετάβλητη). Από τη στιγμή που θα δημιουργηθεί, η μορφή του "παγώνει". Δεν μπορείτε να προσθέσετε, να τροποποιήσετε ή να διαγράψετε κανένα απολύτως στοιχείο.
Πού χρησιμεύουν πρακτικά; Τέτοιου είδους σύνολα χρησιμοποιούνται σε περιπτώσεις όπου θέλουμε να "κλειδώσουμε" και να προστατεύσουμε μια συλλογή δεδομένων από τυχαίες αλλαγές κατά την εκτέλεση του κώδικά μας. Ένα εξαιρετικό παράδειγμα είναι η αποθήκευση μιας λίστας από εγκεκριμένους αριθμούς τραπεζικών λογαριασμών (IBANs) που δεν πρέπει σε καμία περίπτωση να μεταβληθούν από το πρόγραμμα. Επιπλέον, λόγω ακριβώς της αμετάβλητης φύσης τους, τα Frozensets είναι τα μόνα σύνολα που επιτρέπεται να χρησιμοποιηθούν ως κλειδιά (keys) μέσα σε ένα λεξικό (Dictionary)!
Για να ορίσουμε ένα τέτοιο σύνολο, χρησιμοποιούμε αποκλειστικά την ενσωματωμένη συνάρτηση frozenset().
app.py
teams = frozenset({'Arsenal', 'Burnley', 'Everton', 'Aston Villa', 'Arsenal'})print(teams)
Output
Μην ξεχάσετε
να κάνετε ένα μικρό donation έτσι ώστε αυτό το site να μεγαλώσει ακόμα πιο πολύ
και να αποκτήσει περισσότερες δυνατότητες online παράδοσης δωρεάν μαθημάτων.
full-width


0 Comments
What do you think about Ground of Code?