Advertisement
LevMukoseev

Stat

Mar 5th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.59 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. import collections
  3. import re
  4.  
  5.  
  6. def get_key(item):
  7.     return item[1]
  8.  
  9.  
  10. def is_female(name):
  11.     right_ending = name[1][-1] in ["я", "а"]
  12.     not_male = name[1] not in ["Илья", "Лёва", "Никита"]
  13.     exceptional_case = name[1] == "Любовь"
  14.     return exceptional_case or (right_ending and not_male)
  15.  
  16.  
  17. def make_stat(filename):
  18.     """
  19.    Функция вычисляет статистику по именам за каждый год с учётом пола.
  20.    """
  21.     file = open(filename, "r", encoding="cp1251")
  22.     data = 0
  23.     statistic = {}
  24.     counter = collections.Counter()
  25.     for line in file:
  26.         if line[2:6] != '<tr>':
  27.             continue
  28.         if line[27] == 'h':
  29.             if data != 0:
  30.                 statistic[data] = counter
  31.                 counter = collections.Counter()
  32.             data = line[30:34]
  33.             continue
  34.         name = re.search(r'[а-яА-ЯёЁ]+ [а-яА-ЯёЁ]+', line).group().split()
  35.         gender = "М"
  36.         if is_female(name):
  37.             gender = "Ж"
  38.         counter[name[1] + '(' + gender + ')'] += 1
  39.     statistic[data] = counter
  40.     file.close()
  41.     return statistic
  42.  
  43.  
  44. def extract_years(stat):
  45.     """
  46.    Функция принимает на вход вычисленную статистику и выдаёт список годов,
  47.    упорядоченный по возрастанию.
  48.    """
  49.     return sorted(stat.keys())
  50.  
  51.  
  52. def extract_general(stat):
  53.     """
  54.    Функция принимает на вход вычисленную статистику и выдаёт список tuple'ов
  55.    (имя, количество) общей статистики для всех имён.
  56.    Список должен быть отсортирован по убыванию количества.
  57.    """
  58.     names_stat = collections.Counter()
  59.     for year in stat:
  60.         for name in stat[year]:
  61.             names_stat[name[:len(name) - 3]] += stat[year][name]
  62.     return sorted(names_stat.items(), key=get_key, reverse=True)
  63.  
  64.  
  65. def extract_general_male(stat):
  66.     """
  67.    Функция принимает на вход вычисленную статистику и выдаёт список tuple'ов
  68.    (имя, количество) общей статистики для имён мальчиков.
  69.    Список должен быть отсортирован по убыванию количества.
  70.    """
  71.     names_male_stat = collections.Counter()
  72.     for year in stat:
  73.         for name in stat[year]:
  74.             if name[-2] == "Ж":
  75.                 continue
  76.             names_male_stat[name[:len(name) - 3]] += stat[year][name]
  77.     return sorted(names_male_stat.items(), key=get_key, reverse=True)
  78.  
  79.  
  80. def extract_general_female(stat):
  81.     """
  82.    Функция принимает на вход вычисленную статистику и выдаёт список tuple'ов
  83.    (имя, количество) общей статистики для имён девочек.
  84.    Список должен быть отсортирован по убыванию количества.
  85.    """
  86.     names_female_stat = collections.Counter()
  87.     for year in stat:
  88.         for name in stat[year]:
  89.             if name[-2] == "М":
  90.                 continue
  91.             names_female_stat[name[:len(name) - 3]] += stat[year][name]
  92.     return sorted(names_female_stat.items(), key=get_key, reverse=True)
  93.  
  94.  
  95. def extract_year(stat, year):
  96.     """
  97.    Функция принимает на вход вычисленную статистику и год.
  98.    Результат — список tuple'ов (имя, количество) общей статистики для всех
  99.    имён в указанном году.
  100.    Список должен быть отсортирован по убыванию количества.
  101.    """
  102.     names_stat = collections.Counter()
  103.     for name in stat[year]:
  104.         names_stat[name[:len(name) - 3]] += stat[year][name]
  105.     return sorted(names_stat.items(), key=get_key, reverse=True)
  106.  
  107.  
  108. def extract_year_male(stat, year):
  109.     """
  110.    Функция принимает на вход вычисленную статистику и год.
  111.    Результат — список tuple'ов (имя, количество) общей статистики для всех
  112.    имён мальчиков в указанном году.
  113.    Список должен быть отсортирован по убыванию количества.
  114.    """
  115.     names_stat_male = collections.Counter()
  116.     for name in stat[year]:
  117.         if name[-2] == "Ж":
  118.             continue
  119.         names_stat_male[name[:len(name) - 3]] += stat[year][name]
  120.     return sorted(names_stat_male.items(), key=get_key, reverse=True)
  121.  
  122.  
  123. def extract_year_female(stat, year):
  124.     """
  125.    Функция принимает на вход вычисленную статистику и год.
  126.    Результат — список tuple'ов (имя, количество) общей статистики для всех
  127.    имён девочек в указанном году.
  128.    Список должен быть отсортирован по убыванию количества.
  129.    """
  130.     names_stat_male = collections.Counter()
  131.     for name in stat[year]:
  132.         if name[-2] == "М":
  133.             continue
  134.         names_stat_male[name[:len(name) - 3]] += stat[year][name]
  135.     return sorted(names_stat_male.items(), key=get_key, reverse=True)
  136.  
  137.  
  138. if __name__ == '__main__':
  139.     stat = make_stat("home.html")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement