Сделал тут упражнение, всё работает, но, если у кого будет время посмотреть (оно простое), буду признателен за замечания.
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
"""
Программа получает из файла sample.txt информацию о матчах и победах
игроков и возвращает таблицу результатов игр, сотрированную по возрастанию относительно побед каждого игрока, при равном количестве побед фамилии игроков сортируются по алфавиту.
Текстовый файл с информацией о матчах и победах выглядит так:
Beth Ana Charlie Dave
Ana vs Dave | 3:0
Charlie vs Beth | 3:1
Ana vs Beth | 2:3
Dave vs Charlie | 3:0
Ana vs Charlie | 3:1
Beth vs Dave | 0:3
Первая строка данного файла содержит имена игроков, далее запись в следующем формате:
<Имя> vs <Имя> | <Счёт>
Результатом действия программы является вывод на терминал такого сообщения:
Dave has won 2 matches and 6 sets
Ana has won 2 matches and 8 sets
Beth has won 1 matches and 4 sets
Charlie has won 1 matches and 4 sets
"""
def add_dic(dic, key, value):
""" ПП увеличивает значение ключа key в словаре dic на значение value, если ключ отсутсвоует - создаёт новуя пару key, value """
if dic.has_key(key):
dic[key] += int(value)
else:
dic[key] = int(value)
def sub_split(line, key):
""" ПП разбивает строку line на две подстроки по содержимому параметра key, удаляя начальные и концевые пробелы у результирующих подстрок """
r_1, r_2 = line.split(key)
r_1 = r_1.strip()
r_2 = r_2.strip()
return r_1, r_2
def invd(d):
""" ПП создаёт из ключей словаря d сортированный (по возрастанию значений и алфавиту ключей) список """
# Создаётся новый словарь
nd = {}
# Создаётся результирующий список
r = []
# Инвертируется заданный словарь
for i,j in d.iteritems():
nd.setdefault(j,[]).append(i)
# сортируется словарь
nd[j].sort()
print "nd = %s" % nd
# формируется плоский список путём конкатенации значений словаря nd
for i in nd:
r = r + nd[i]
# применяется reverse() к списку
r.reverse()
print "r = %s" % r
return r
# Begin programm
# sets - игры;
# matches - победы.
sets, matches = ({}, {})
# открывается файл с исходными данными
file = open("sample.txt")
# считывается первая строка из файла с исходными данными, содержащая имена игроков
names = file.readline().strip().split(' ')
# проход по файлу
for lines in file:
# пары записываются в paring, результат игр - в result
paring, result = lines.strip().split('|')
# p1, p2 будут содержать имена игроков в паре
p1, p2 = sub_split(paring, 'vs')
# r1, r2 будут содержать результат каждого из игроков пары
r1, r2 = sub_split(result, ':')
# запись результата матча в словарь sets для первого игрока пары
add_dic(sets,p1,r1)
# запись результата матча в словарь sets для второго игрока пары
add_dic(sets,p2,r2)
# в зависимости от результата игры добавляется имя победителя в словарь matches
if r1 > r2:
add_dic(matches,p1,1)
else:
add_dic(matches,p2,1)
# получение списка игроков, упорядоченного в соответствии от количества побед и в соответсвии с алфавитом
listwin = invd(matches)
# проход по упорядоченному списку игрогов с печатью результатов
for i in listwin:
print "%s has won %d matches and %d sets" % (i, matches[i], sets[i])
# закрытие файла с результатами игр
file.close()