De Olympische Spelen doen traditioneel in heel veel landen een gevoel van nationale trots opflakkeren. Alle mogelijke lijstjes van gevestigde records worden bijgehouden en iedereen schept op met het aantal medailles dat zijn land heeft binnengehaald.

Opgave

  1. Schrijf een functie medailleOverzicht waaraan twee argumenten moeten doorgegeven worden. Het eerste argument is verplicht en is een lijst met tuples zoals hieronder uitgelegd. Het tweede argument is optioneel en heeft als mogelijke waarden de strings gold, silver en bronze. Als dit tweede argument wordt opgegeven, dan worden enkel de medailles van die soort geteld. Als het tweede argument niet opgegeven wordt, dan worden alle medailles meegeteld. De functie moet een dictionary teruggeven die elke landcode in de lijst koppelt aan het aantal medailles dat dat land heeft behaald.

    Als eerste argument krijg je een lijst van tuples, waarbij elk tuple een reeks velden bevat met informatie over een gewonnen medaille. Als voorbeeld zie je hieronder de (ingekorte) lijst met informatie over alle medailles die tijdens de Olympische Spelen van 2008 in Peking werden behaald in het schermen. Elk tuple in de lijst bevat 6 velden: een landcode, het land, de sport, de discipline, de medaille en de atleten.

    [('CN', 'China', 'Fencing', "Men's Individual Sabre", 'gold', 'ZHONG Man'),
     ('CN', 'China', 'Fencing', "Women's Team Sabre", 'silver', 'NI Hong, ...'),
     ('ES', 'Spain', 'Fencing', "Men's Individual Epee", 'bronze', 'ABAJO Jose Luis'),
     ('FR', 'France', 'Fencing', "Men's Individual Epee", 'silver', 'JEANNET Fabrice'),
     ('FR', 'France', 'Fencing', "Men's Individual Sabre", 'silver', 'LOPEZ Nicolas'),
     ('FR', 'France', 'Fencing', "Men's Team Epee", 'gold', 'JEANNET Fabrice,...'),
     ('FR', 'France', 'Fencing', "Men's Team Sabre", 'gold', 'PILLET Julien, ...'),
     ('DE', 'Germany', 'Fencing', "Men's Individual Foil", 'gold', 'KLEIBRINK Benjamin Philip'),
     ('DE', 'Germany', 'Fencing', "Women's Individual Epee", 'gold', 'HEIDEMANN Britta'),
     ('HU', 'Hungary', 'Fencing', "Women's Individual Epee", 'bronze', 'MINCZA-NEBALD Ildiko'),
     ('IT', 'Italy', 'Fencing', "Men's Individual Foil", 'bronze', 'SANZO Salvatore'),
     ('IT', 'Italy', 'Fencing', "Women's Individual Foil", 'gold', 'VEZZALI Maria Valentina'),
     ('IT', 'Italy', 'Fencing', "Women's Individual Foil", 'bronze', 'GRANBASSI Margherita'),
     ('IT', 'Italy', 'Fencing', "Men's Individual Epee", 'gold', 'TAGLIARIOL Matteo'),
     ('IT', 'Italy', 'Fencing', "Men's Team Epee", 'bronze', 'ROTA Alfredo, ...'),
     ('IT', 'Italy', 'Fencing', "Men's Team Sabre", 'bronze', 'MONTANO Aldo, ...'),
     ('IT', 'Italy', 'Fencing', "Women's Team Foil", 'bronze', 'GRANBASSI Margherita, ...'),
     ('JP', 'Japan', 'Fencing', "Men's Individual Foil", 'silver', 'OTA Yuki'),
     ('KR', 'Korea', 'Fencing', "Women's Individual Foil", 'silver', 'NAM Hyunhee'),
     ('PL', 'Poland', 'Fencing', "Men's Team Epee", 'silver', 'ANDRZEJUK Robert, ...'),
     ('RO', 'Romania', 'Fencing', "Women's Individual Epee", 'silver', 'BRANZA Ana Maria'),
     ('RO', 'Romania', 'Fencing', "Men's Individual Sabre", 'bronze', 'COVALIU Mihai'),
     ('RU', 'Russian Fed.', 'Fencing', "Women's Team Foil", 'gold', 'LAMONOVA Evgenia, ...'),
     ('UA', 'Ukraine', 'Fencing', "Women's Team Sabre", 'gold', 'KHOMROVA Olena, ...'),
     ('US', 'United States', 'Fencing', "Women's Individual Sabre", 'gold', 'ZAGUNIS Mariel'),
     ('US', 'United States', 'Fencing', "Women's Individual Sabre", 'silver', 'JACOBSON Sada'),
     ('US', 'United States', 'Fencing', "Women's Individual Sabre", 'bronze', 'WARD Becca'),
     ('US', 'United States', 'Fencing', "Men's Team Sabre", 'silver', 'MOREHOUSE Tim, ...'),
     ('US', 'United States', 'Fencing', "Women's Team Foil", 'silver', 'CROSS Emily, ...'),
     ('US', 'United States', 'Fencing', "Women's Team Sabre", 'bronze', 'JACOBSON Sada, ...')]

  2. Schrijf een functie top die als verplicht argument een dictionary neemt zoals die door de functie medailleOverzicht wordt teruggegeven, en ook een optioneel argument heeft met naam n en als waarde een getal, dat standaard gelijk is aan 10. Als resultaat geeft deze functie een lijst van tuples terug die een top n bevat van landen volgens hun aantal medailles. Deze lijst moet gerangschikt zijn zodat het eerste element in de lijst het meest aantal medailles heeft. De tuples bevatten als eerste element de landcode en als tweede element het aantal medailles.

Bekijk ook het onderstaande voorbeeld om eventuele onduidelijkheden over hoe de functies moeten werken te vermijden. Je kan ook de lijst met alle medailles van de Olympische Spelen van 2008 in Peking downloaden als het bestand peking_medals.txt1.

Voorbeeld

>>> fencing = [
...     ('CN', 'China', 'Fencing', "Men's Individual Sabre", 'gold', 'ZHONG Man'),
...     ('CN', 'China', 'Fencing', "Women's Team Sabre", 'silver', 'NI Hong, TAN Xue, HUANG Haiyang, BAO Yingying'),
...     ('ES', 'Spain', 'Fencing', "Men's Individual Epee", 'bronze', 'ABAJO Jose Luis'),
...     ('FR', 'France', 'Fencing', "Men's Individual Epee", 'silver', 'JEANNET Fabrice'),
...     ('FR', 'France', 'Fencing', "Men's Individual Sabre", 'silver', 'LOPEZ Nicolas'),
...     ('FR', 'France', 'Fencing', "Men's Team Epee", 'gold', 'JEANNET Fabrice, JEANNET Jerome, ROBEIRI Ulrich'),
...     ('FR', 'France', 'Fencing', "Men's Team Sabre", 'gold', 'PILLET Julien, SANSON Boris, LOPEZ Nicolas'),
...     ('DE', 'Germany', 'Fencing', "Men's Individual Foil", 'gold', 'KLEIBRINK Benjamin Philip'),
...     ('DE', 'Germany', 'Fencing', "Women's Individual Epee", 'gold', 'HEIDEMANN Britta'),
...     ('HU', 'Hungary', 'Fencing', "Women's Individual Epee", 'bronze', 'MINCZA-NEBALD Ildiko'),
...     ('IT', 'Italy', 'Fencing', "Men's Individual Foil", 'bronze', 'SANZO Salvatore'),
...     ('IT', 'Italy', 'Fencing', "Women's Individual Foil", 'gold', 'VEZZALI Maria Valentina'),
...     ('IT', 'Italy', 'Fencing', "Women's Individual Foil", 'bronze', 'GRANBASSI Margherita'),
...     ('IT', 'Italy', 'Fencing', "Men's Individual Epee", 'gold', 'TAGLIARIOL Matteo'),
...     ('IT', 'Italy', 'Fencing', "Men's Team Epee", 'bronze', 'ROTA Alfredo, TAGLIARIOL Matteo, CAROZZO Stefano, CONFALONIERI Diego'),
...     ('IT', 'Italy', 'Fencing', "Men's Team Sabre", 'bronze', 'MONTANO Aldo, PASTORE Giampiero, TARANTINO Luigi, OCCHIUZZI Diego'),
...     ('IT', 'Italy', 'Fencing', "Women's Team Foil", 'bronze', 'GRANBASSI Margherita, VEZZALI Maria Valentina, TRILLINI Giovanna, SALVATORI Ilaria'),
...     ('JP', 'Japan', 'Fencing', "Men's Individual Foil", 'silver', 'OTA Yuki'),
...     ('KR', 'Korea', 'Fencing', "Women's Individual Foil", 'silver', 'NAM Hyunhee'),
...     ('PL', 'Poland', 'Fencing', "Men's Team Epee", 'silver', 'ANDRZEJUK Robert, MOTYKA Tomasz, ZAWROTNIAK Radoslaw, WIERCIOCH Adam'),
...     ('RO', 'Romania', 'Fencing', "Women's Individual Epee", 'silver', 'BRANZA Ana Maria'),
...     ('RO', 'Romania', 'Fencing', "Men's Individual Sabre", 'bronze', 'COVALIU Mihai'),
...     ('RU', 'Russian Fed.', 'Fencing', "Women's Team Foil", 'gold', 'LAMONOVA Evgenia, NIKICHINA Victoria, SHANAEVA Aida, BOYKO Svetlana'),
...     ('UA', 'Ukraine', 'Fencing', "Women's Team Sabre", 'gold', 'KHOMROVA Olena, PUNDYK Halyna, KHARLAN Olga, ZHOVNIR Olha'),
...     ('US', 'United States', 'Fencing', "Women's Individual Sabre", 'gold', 'ZAGUNIS Mariel'),
...     ('US', 'United States', 'Fencing', "Women's Individual Sabre", 'silver', 'JACOBSON Sada'),
...     ('US', 'United States', 'Fencing', "Women's Individual Sabre", 'bronze', 'WARD Becca'),
...     ('US', 'United States', 'Fencing', "Men's Team Sabre", 'silver', 'MOREHOUSE Tim, ROGERS Jason, SMART Keeth, WILLIAMS James'),
...     ('US', 'United States', 'Fencing', "Women's Team Foil", 'silver', 'CROSS Emily, SMART Erinn, THOMPSON Hanna'),
...     ('US', 'United States', 'Fencing', "Women's Team Sabre", 'bronze', 'JACOBSON Sada, ZAGUNIS Mariel, WARD Becca')
... ]

>>> medailleOverzicht(fencing)
{'CN': 2, 'DE': 2, 'ES': 1, 'FR': 4, 'HU': 1, 'IT': 7, 'JP': 1, 'KR': 1, 'PL': 1, 'RO': 2, 'RU': 1, 'UA': 1, 'US': 6}
>>> medailleOverzicht(fencing, 'gold')
{'CN': 1, 'DE': 2, 'FR': 2, 'IT': 2, 'RU': 1, 'UA': 1, 'US': 1}
>>> medailleOverzicht(fencing, 'silver')
{'CN': 1, 'FR': 2, 'JP': 1, 'KR': 1, 'PL': 1, 'RO': 1, 'US': 3}
>>> medailleOverzicht(fencing, 'bronze')
{'ES': 1, 'HU': 1, 'IT': 5, 'RO': 1, 'US': 2}

>>> top(medailleOverzicht(fencing), n=3)
[('IT', 7), ('US', 6), ('FR', 4)]