De standaardbibliotheek bestaat al · oefening
Uitvoer bewust ordenen
De drie functies die de bibliotheek gebruiken geven vaste feiten terug, maar voor de presentatie is nog een keuze nodig. Counter onthoudt de volgorde waarin elke categorie voor het eerst verschijnt. Deze invoeren leveren daarom gelijke aantallen met een verschillende sleutelvolgorde op:
first = [walk_record, read_record]
second = [read_record, walk_record]
Een rapport dat de invoervolgorde volgt, verandert als je de records herschikt. Dat geeft onnodige verschillen in tests, vergelijkingen en later opgeslagen data.
Sorteer een aparte lijst
Maak een lijst van de categoriesleutels van Counter en roep daarop de methode .sort() aan. Zonder argument herschikt .sort() de lijst zelf in natuurlijke volgorde: strings worden hier alfabetisch geordend.
Waar mensen over struikelen is wat .sort() teruggeeft:
De gesorteerde lijst is names. De methode geeft None terug, dus die terugkeerwaarde toewijzen en erover proberen te lussen is een veelgemaakte fout.
Probeer niet de Counter zelf te sorteren. Maak een aparte namenlijst, sorteer die en maak dan name=count-delen in die volgorde. Tellen en presenteren blijven aparte taken.
Waar staat na names.sort() het alfabetische resultaat?
Test dit rechtstreeks: zet de records met de hand in een andere volgorde, roep de opmaakfunctie twee keer aan en controleer of beide aanroepen dezelfde regel teruggeven. Verandert de regel als de invoervolgorde verandert, dan doet het sorteren zijn werk niet.
Opdracht
Implementeer format_category_counts(records) in activity_report.py.
Roep
count_categories(records)aan.Maak een aparte lijst met elke categoriesleutel uit de Counter.
Roep
.sort()aan op die lijst.Maak
name=count-delen in de gesorteerde volgorde.Geef de delen terug, samengevoegd met
,.
Laat een lege recordlijst vanzelf de lege string opleveren. Leg de voorbeeldcategorieën niet vast in de code en vertrouw niet op de volgorde waarin records verschijnen.