Advertisement
mikhailemv

2.3

Dec 13th, 2022
585
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.76 KB | None | 0 0
  1. from csv import reader
  2. from re import sub
  3.  
  4.  
  5. def get_salary_list(current_data: list, counter=10) -> list:
  6.     salary_list = list()
  7.     for element in current_data:
  8.         salary_list.append(element)
  9.         if len(salary_list) == counter:
  10.             break
  11.  
  12.     return salary_list
  13.  
  14.  
  15. def get_clean_string(current_string: str) -> str:
  16.     current_string = sub(r'<[^>]*>', '', current_string)
  17.     return ' '.join(current_string.split(' '))
  18.  
  19.  
  20. def get_cities_top(current_data: list) -> tuple:
  21.     cities_and_their_salary, cities_top_list = dict(), list()
  22.     for element in current_data:
  23.         city_key, salary_value = element['area_name'], \
  24.             calculate_average(element['salary_from'],
  25.                               element['salary_to'])
  26.         if city_key in cities_and_their_salary.keys():
  27.             cities_and_their_salary[city_key][0] += salary_value
  28.             cities_and_their_salary[city_key][1] += 1
  29.         else:
  30.             cities_and_their_salary[city_key] = [salary_value, 1]
  31.  
  32.     for city, salary in cities_and_their_salary.items():
  33.         if round(salary[1] / len(current_data), 3) >= 0.01:
  34.             average_salary = salary[0] // salary[1]
  35.             cities_top_list.append((city, average_salary, salary[1]))
  36.  
  37.     cities_top_list.sort(key=lambda skill: skill[1], reverse=True)
  38.  
  39.     return cities_top_list, len(cities_and_their_salary)
  40.  
  41.  
  42. def get_popular_skills_list(current_data: list) -> list:
  43.     skills_list, skills_and_their_count = list(), dict()
  44.     for string in current_data:
  45.         for current_skill in string['key_skills'].split('\n'):
  46.             if current_skill not in skills_and_their_count.keys():
  47.                 skills_and_their_count[current_skill] = 1
  48.             else:
  49.                 skills_and_their_count[current_skill] += 1
  50.  
  51.     for skill, count in skills_and_their_count.items():
  52.         skills_list.append((skill, count))
  53.     skills_list.sort(key=lambda el: el[1], reverse=True)
  54.  
  55.     return skills_list
  56.  
  57.  
  58. def calculate_average(salary_from: int, salary_to: int) -> int:
  59.     return int(float(salary_from) + float(salary_to)) // 2
  60.  
  61.  
  62. def define_suffix_right_form(number: int, word: list) -> str:
  63.     if 11 <= number % 100 <= 19:
  64.         return f'{number} {word[2]}'
  65.     if number % 10 == 1:
  66.         return f'{number} {word[0]}'
  67.     elif 2 <= number % 10 <= 4:
  68.         return f'{number} {word[1]}'
  69.     else:
  70.         return f'{number} {word[2]}'
  71.  
  72.  
  73. def print_top_skills(top_skills_list: list) -> None:
  74.     skills_suffixes = ['скилла', 'скиллов', 'скиллов']
  75.     print(f'Из {define_suffix_right_form(len(top_skills_list), skills_suffixes)}, '
  76.           f'самыми популярными являются:')
  77.     count_suffixes = ['раз', 'раза', 'раз']
  78.  
  79.     for i in range(0, min(len(top_skills_list), 10)):
  80.         print(f'    {i + 1}) {top_skills_list[i][0]} - '
  81.               f'упоминается {define_suffix_right_form(top_skills_list[i][1], count_suffixes)}')
  82.     print()
  83.  
  84.  
  85. def print_top_cities(top_cities_list: list, needed_count: int) -> None:
  86.     cities_suffixes = ['города', 'городов', 'городов']
  87.     print(f'Из {define_suffix_right_form(needed_count, cities_suffixes)}, самые высокие средние ЗП:')
  88.     rubles_suffixes = ['рубль', 'рубля', 'рублей']
  89.     vacancies_suffixes = ['вакансия', 'вакансии', 'вакансий']
  90.  
  91.     for i in range(0, min(len(top_cities_list), 10)):
  92.         print(f'    {i + 1}) {top_cities_list[i][0]} - средняя зарплата'
  93.               f' {define_suffix_right_form(top_cities_list[i][1], rubles_suffixes)} ('
  94.               f'{define_suffix_right_form(top_cities_list[i][2], vacancies_suffixes)})')
  95.  
  96.  
  97. def print_top_salaries(top_salaries: list, caption: str) -> None:
  98.     rubles_suffixes = ['рубль', 'рубля', 'рублей']
  99.     print(caption)
  100.     for i in range(len(top_salaries)):
  101.         name = top_salaries[i]["name"]
  102.         employer_name = top_salaries[i]["employer_name"]
  103.         avg_salary = calculate_average(top_salaries[i]['salary_from'], top_salaries[i]['salary_to'])
  104.         city = top_salaries[i]['area_name']
  105.         print(f'    {i + 1}) {name} в компании "{employer_name}"'
  106.               f' - {avg_salary} {define_suffix_right_form(avg_salary, rubles_suffixes)} (г. {city})')
  107.     print()
  108.  
  109.  
  110. def csv_reader(file_naming: str) -> tuple:
  111.     csv_file = reader(open(file_naming, encoding='utf_8_sig'))
  112.     all_needed_data = [current_data for current_data in csv_file]
  113.  
  114.     return all_needed_data[0], \
  115.         [x for x in all_needed_data[1:]
  116.          if x.count('') == 0 and len(x) == len(all_needed_data[0])]
  117.  
  118.  
  119. def csv_filer(current_reader: tuple, headline: list) -> list:
  120.     vacancies_list = list()
  121.  
  122.     for vacancy in current_reader:
  123.         vacancies_list.append({headline[i]: get_clean_string(vacancy[i]) for i in range(len(headline))})
  124.  
  125.     return vacancies_list
  126.  
  127.  
  128. headlines, vacancies = csv_reader(input())
  129. all_start_data, data_filtered = csv_filer(vacancies, headlines), list()
  130. for cur_data in all_start_data:
  131.     if 'RUR' == cur_data['salary_currency']:
  132.         data_filtered.append(cur_data)
  133.  
  134. key_for_sorting = lambda d: calculate_average(d['salary_from'], d['salary_to'])
  135.  
  136. top_high_salaries = get_salary_list(sorted(data_filtered, key=key_for_sorting, reverse=True), True)
  137. top_low_salaries = get_salary_list(sorted(data_filtered, key=key_for_sorting, reverse=False), False)
  138. cities_top, cities_count = get_cities_top(data_filtered)
  139.  
  140. print_top_salaries(top_high_salaries, 'Самые высокие зарплаты:')
  141. print_top_salaries(top_low_salaries, 'Самые низкие зарплаты:')
  142.  
  143. print_top_skills(get_popular_skills_list(data_filtered))
  144. print_top_cities(cities_top, cities_count)
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement