Λίστες, λεξικά και σύνολα — DedSec Project
Συλλογές — σειρά, επαναλήψεις και μοναδικές τιμές Η έννοια και το αναμενόμενο αποτέλεσμα Οι λίστες, τα λεξικά και τα σύνολα εξυπηρετούν διαφορετικές ανάγκες. Σε μία λίστα ονομάτων που…
Συλλογές — σειρά, επαναλήψεις και μοναδικές τιμές
Η έννοια και το αναμενόμενο αποτέλεσμα
Οι λίστες, τα λεξικά και τα σύνολα εξυπηρετούν διαφορετικές ανάγκες. Σε μία λίστα ονομάτων που επέλεξε ο χρήστης, τόσο η σειρά όσο και οι επαναλήψεις μπορεί να είναι σημαντικές. Ένα λεξικό συχνοτήτων μετρά πόσες φορές εμφανίζεται κάθε όνομα. Μία λίστα μοναδικών ονομάτων μπορεί να κρατά μόνο την πρώτη εμφάνιση του κάθε ονόματος. Η άμεση μετατροπή της αρχικής λίστας σε set μπορεί να χάσει πληροφορίες χρήσιμες στην εφαρμογή.
Εκτελέσιμη άσκηση Python 3
Αποθήκευσε ως 06_Collections.py και εκτέλεσε με Python 3. Πρώτα πρόβλεψε το αποτέλεσμα· όλοι οι έλεγχοι χρησιμοποιούν απλές τεχνητές τιμές χωρίς δίκτυο.
def catalog(names):
if not isinstance(names, list) or not all(type(x) is str and x for x in names):
raise ValueError("list of nonempty names required")
counts = {}
for name in names:
counts[name] = counts.get(name, 0) + 1
unique_first_seen = list(dict.fromkeys(names))
return unique_first_seen, counts
unique, counts = catalog(["Ada","Grace","Ada","Αθηνά"])
assert unique == ["Ada","Grace","Αθηνά"]
assert counts == {"Ada":2,"Grace":1,"Αθηνά":1}
assert catalog([]) == ([], {})
try: catalog(["ok",None])
except ValueError: pass
else: raise AssertionError("wrong element type accepted")
print("PASS ordered collection and frequency map")
Γιατί λειτουργεί
Ο κώδικας διατρέχει μία φορά τη λίστα για τις συχνότητες και χρησιμοποιεί dict.fromkeys ώστε να διατηρεί τη σειρά πρώτης εμφάνισης σε σύγχρονες εκδόσεις Python. Το λεξικό προσφέρει συνήθως γρήγορη αναζήτηση κλειδιού, ενώ η λίστα κρατά τη σειρά εμφάνισης. Ελληνικό κείμενο όπως Αθηνά μπορεί να είναι κανονικό κλειδί. Η κενή λίστα δίνει δύο κενές συλλογές, αλλά άκυρα στοιχεία όπως None απορρίπτονται.
Καθοδηγούμενη εξάσκηση
Πρόσθεσε μία ακόμη Ada και πρόβλεψε τη συχνότητα πριν εκτελέσεις. Άλλαξε τη σειρά και έλεγξε ότι οι συχνότητες μένουν ίδιες ενώ αλλάζει η μοναδική λίστα. Σύγκρινε το set(names) με τη λίστα πρώτης εμφάνισης και σημείωσε τι χάνεται. Δοκίμασε ακέραιο μέσα στη λίστα, κενό όνομα και tuple αντί για list.
Αντιμετώπιση λαθών
Αν εμφανιστεί KeyError κατά την καταμέτρηση, χρησιμοποίησε counts.get(name,0) αντί να θεωρείς ότι το κλειδί υπάρχει. Αν εξαφανίζονται διπλά στοιχεία, βρες τη μετατροπή σε set. Μην βασίζεσαι στη σειρά επανάληψης ενός συνόλου όταν θέλεις προβλέψιμη εμφάνιση στη διεπαφή.