Marató

Els resultats de carreres de marató s’emmagatzemen en fitxers amb una estructura on la primera línia conté una capçalera detallant el significat de cada dada del fitxer i, per les següents línies, cadascuna correspon a un corredor i, per cadascún, s’indica el cognom, el temps de la carrera (hores, minuts i segons) i la nacionalitat, tot separat per espais. Com a exemple, pots descarregar el fitxer marato.txt que té el següent contingut:

nom hores minuts segons país
Gebrmariam 02 08 14 ETH
Mutai 02 09 18 KEN
Kipkosgei 02 10 39 KEN
Goumri 02 10 51 MAR
Kwambai 02 11 31 KEN
Keflezighi 02 11 38 USA
DosSantos 02 11 51 BRA

Desa les següents funcions al fitxer marato.py.

  1. Dissenya la funció converteix() que donat el nom d’un fitxer amb resultats d’una marató, retorni una llista de tuples on cada tuple correspongui a un corredor i contingui el cognom, el temps de la carrera convertit a segons i la nacionalitat. Aquesta llista ha d’estar en el mateix ordre que el fitxer. Exemple:

    >>> converteix('marato.txt')
    [('Gebrmariam', 7694, 'ETH'), ('Mutai', 7758, 'KEN'), ('Kipkosgei', 7839, 'KEN'), ('Goumri', 7851, 'MAR'), ('Kwambai', 7891, 'KEN'), ('Keflezighi', 7898, 'USA'), ('DosSantos', 7911, 'BRA')]
    

    Nota

    Podeu descarregar el fitxer amb tests converteix.txt

  2. Dissenya la funció temps_sota() que donada una llista de tuples com la de l’apartat anterior i un temps t en segons, indiqui si algun corredor ha fet un temps per sota de t. Tingues en compte que la llista pot no estar ordenada.

    >>> lt = [('Gebrmariam', 7688, 'ETH'), ('Mutai', 7749, 'KEN'),
    ...      ('Kipkosgei', 7810, 'KEN'), ('Goumri', 7810, 'MAR'),
    ...      ('Kwambai', 7871, 'KEN'), ('Keflezighi', 7871, 'USA'),
    ...      ('DosSantos', 7871, 'BRA')]
    >>> temps_sota(lt,7700)
    True
    >>> temps_sota(lt,7650)
    False
    >>> lt = [('Gebrmariam', 7694, 'ETH'), ('Mutai', 7758, 'KEN'),
    ...       ('Kipkosgei', 7839, 'KEN'), ('Goumri', 7851, 'MAR')]
    >>> temps_sota(lt,7600)
    False
    >>> lt = [('Gebrmariam', 7694, 'ETH'), ('Mutai', 7758, 'KEN'),
    ...       ('Kipkosgei', 7439, 'KEN'), ('Goumri', 7851, 'MAR')]
    >>> temps_sota(lt,7600)
    True
    
    

    Nota

    Podeu descarregar el fitxer amb tests temps_sota.txt

  3. Dissenya una funció diferencia_primer() que donada una llista de tuples com les dels apartats anteriors i el nom d’un fitxer, creï un fitxer amb el nom donat on cada línia representa un corredor i inclou el cognom i el temps de diferència amb el primer classificat en segons separats per un espai en blanc. Suposa que la llista està ordenada per temps. El primer classificat també ha d’aparèixer al fitxer amb un temps de 0.

    >>> lt = [('Gebrmariam', 7688, 'ETH'), ('Mutai', 7749, 'KEN'),
    ...      ('Kipkosgei', 7810, 'KEN'), ('Goumri', 7810, 'MAR'),
    ...      ('Kwambai', 7871, 'KEN'), ('Keflezighi', 7871, 'USA'),
    ...      ('DosSantos', 7871, 'BRA')]
    >>> diferencia_primer(lt, 'dif1.txt')
    >>> f1 = open ('dif1.txt', 'r')
    >>> s1 = f1.read()
    >>> s1
    'Gebrmariam 0\nMutai 61\nKipkosgei 122\nGoumri 122\nKwambai 183\nKeflezighi 183\nDosSantos 183\n'
    >>> lt = [('Kwambai', 7871, 'KEN'), ('Gebrmariam', 7894, 'ETH'),
    ...       ('Keflezighi', 7899, 'USA'), ('Mutai', 7931, 'KEN'),
    ...       ('Kipkosgei', 7956, 'KEN'), ('Goumri', 7979, 'MAR')]
    >>> diferencia_primer(lt, 'dif2.txt')
    >>> f2 = open ('dif2.txt', 'r')
    >>> s2 = f2.read()
    >>> s2
    'Kwambai 0\nGebrmariam 23\nKeflezighi 28\nMutai 60\nKipkosgei 85\nGoumri 108\n'
    
    

    Nota

    Podeu descarregar el fitxer amb tests diferencia_primer.txt

Solucions

Disposeu de solucions al fitxer marato.py