計算機科学のブログ

ほしい物リスト

Python - gazpacho - Working with Data: Data Manipulation - list, html

Head First Python: A Learner’s Guide to the Fundamentals of Python Programming, A Brain-Friendly GuidePaul Barry(著)、 O’Reilly Mediaの Chapter 10. (Working with Data: Data Manipulation)、EXERCISE(475/682)の解答を求めてみる。

Jupyter(コード、入出力結果)

webapp/WorldRecords.ipynb

RECORDS = (0, 1, 3, 4) # 本が書かれた時と違ってるっぽい。
COURSES = ('LC Men', 'LC Women', 'SC Men', 'SC Women')
records = {}
for table, course in zip(RECORDS, COURSES):
    records[course] = {}
    for row in tables[table].find('tr', mode='all')[1:]:
        columns = row.find('td', mode='all')
        event = columns[0].text
        time = columns[1].text
        records[course][event] = time
conversions = {
    'Free': 'freestyle',
    'Back': 'backstroke',
    'Breast': 'breaststroke',
    'Fly': 'butterfly',
    'IM': 'individual medley',
}
event = 'Mike-15-100m-Fly.txt'
*_, distance, stroke = event.removesuffix('.txt').split('-')
lookup = f'{distance} {conversions[stroke]}'
lookup
'100m butterfly'
import pprint
pprint.pprint(records)
{'LC Men': {'100m backstroke': '51.60',
            '100m breaststroke': '56.88',
            '100m butterfly': '49.45',
            '100m freestyle': '46.40',
            '1500m freestyle': '14:30.67',
            '200m backstroke': '1:51.92',
            '200m breaststroke': '2:05.48',
            '200m butterfly': '1:50.34',
            '200m freestyle': '1:42.00',
            '200m individual medley': '1:54.00',
            '4 × 100 m freestyle relay': '3:08.24',
            '4 × 100 m medley relay': '3:26.78',
            '4 × 200 m freestyle relay': '6:58.55',
            '400m freestyle': '3:39.96',
            '400m individual medley': '4:02.50',
            '50m backstroke': '23.55',
            '50m breaststroke': '25.95',
            '50m butterfly': '22.27',
            '50m freestyle': '20.91',
            '800m freestyle': '7:32.12'},
 'LC Women': {'100m backstroke': '57.13',
              '100m breaststroke': '1:04.13',
              '100m butterfly': '54.60',
              '100m freestyle': '51.71',
              '1500m freestyle': '15:20.48',
              '200m backstroke': '2:03.14',
              '200m breaststroke': '2:17.55',
              '200m butterfly': '2:01.81',
              '200m freestyle': '1:52.23',
              '200m individual medley': '2:06.12',
              '4 × 100 m freestyle relay': '3:27.96',
              '4 × 100 m medley relay': '3:49.63',
              '4 × 200 m freestyle relay': '7:37.50',
              '400m freestyle': '3:55.38',
              '400m individual medley': '4:24.38',
              '50m backstroke': '26.86',
              '50m breaststroke': '29.16',
              '50m butterfly': '24.43',
              '50m freestyle': '23.61',
              '800m freestyle': '8:04.12'},
 'SC Men': {'100m backstroke': '48.33',
            '100m breaststroke': '55.28',
            '100m butterfly': '47.71',
            '100m freestyle': '44.84',
            '100m individual medley': '49.28',
            '1500m freestyle': '14:06.88',
            '200m backstroke': '1:45.63',
            '200m breaststroke': '2:00.16',
            '200m butterfly': '1:46.85',
            '200m freestyle': '1:38.61',
            '200m individual medley': '1:48.88',
            '4 × 100 m freestyle relay': '3:01.66',
            '4 × 100 m medley relay': '3:18.68',
            '4 × 200 m freestyle relay': '6:40.51',
            '4 × 50 m freestyle relay': '1:20.77',
            '4 × 50 m medley relay': '1:29.72',
            '400m freestyle': '3:32.25',
            '400m individual medley': '3:54.81',
            '50m backstroke': '22.11',
            '50m breaststroke': '24.95',
            '50m butterfly': '21.32',
            '50m freestyle': '19.90',
            '800m freestyle': '7:20.46'},
 'SC Women': {'100m backstroke': '54.02',
              '100m breaststroke': '1:02.36',
              '100m butterfly': '52.71',
              '100m freestyle': '50.25',
              '100m individual medley': '55.11',
              '1500m freestyle': '15:08.24',
              '200m backstroke': '1:58.04',
              '200m breaststroke': '2:12.50',
              '200m butterfly': '1:59.32',
              '200m freestyle': '1:50.31',
              '200m individual medley': '2:01.63',
              '4 × 100 m freestyle relay': '3:25.01',
              '4 × 100 m medley relay': '3:40.41',
              '4 × 200 m freestyle relay': '7:30.13',
              '4 × 50 m freestyle relay': '1:32.50',
              '4 × 50 m medley relay': '1:42.35',
              '400m freestyle': '3:50.25',
              '400m individual medley': '4:15.48',
              '50m backstroke': '25.23',
              '50m breaststroke': '28.37',
              '50m butterfly': '23.94',
              '50m freestyle': '22.83',
              '800m freestyle': '7:57.42'}}
for course in records.keys():
    print(course)
    print(records[course][lookup])
LC Men
49.45
LC Women
54.60
SC Men
47.71
SC Women
52.71
def event_lookup(event):
    conversions = {
        'Free': 'freestyle',
        'Back': 'backstroke',
        'Breast': 'breaststroke',
        'Fly': 'butterfly',
        'IM': 'individual medley',
    }
    *_, distance, stroke = event.removesuffix('.txt').split('-')
    return f'{distance} {conversions[stroke]}'
COURSES = ('LC Men', 'LC Women', 'SC Men', 'SC Women')
fn = 'Mike-15-100m-Fly.txt'
times = []
for course in COURSES:
    times.append(records[course][event_lookup(fn)])
times
['49.45', '54.60', '47.71', '52.71']

コード

footer = f'''
    <p>Average time: {average}</p>
    <p>
        M: {times[0]} ({times[2]})<br>
        W: {times[1]} ({times[4]})
    </p>
</body>

</html>
'''