import json from collections import Counter def load_vacancies(filepath: str) -> list[dict]: try: with open(filepath,"r") as file: return json.load(file) except: print() return [] def filter_by_city(vacancies: list[dict], city: str) -> list[dict]: return [i for i in vacancies if i.get('city','').lower() == city.lower()] def filter_by_skills(vacancies: list[dict], required_skills: list[str]) -> list[dict]: return [i for i in vacancies if all(skill.lower() in set(k.lower() for k in i.get('skills')) for skill in required_skills ) ] def filter_by_salary(vacancies: list[dict], min_salary: int) -> list[dict]: return [v for v in vacancies if v.get('salary_to') and v.get('salary_from') and v.get('salary_to')>= min_salary and v.get('salary_from')> min_salary] def extract_unique_companies(vacancies: list[dict]) -> list[str]: return list({v.get('company') for v in vacancies if v.get('company')}) def extract_top_skills(vacancies: list[dict], top_n: int) -> list[tuple[str, int]]: all_skills = [] for v in vacancies: all_skills.extend(v.get('skills', [])) skill_counts = Counter(all_skills) return skill_counts.most_common(top_n) def calculate_average_salary(vacancies: list[dict]) -> float: if not vacancies: return 0.0 else: salaries = [] for v in vacancies: salary_from = v.get('salary_from') salary_to = v.get('salary_to') if salary_from is not None and salary_to is not None: salaries.append((salary_from + salary_to) / 2) elif salary_from is not None: salaries.append(salary_from) elif salary_to is not None: salaries.append(salary_to) if not salaries: return 0.0 return sum(salaries) / len(salaries) def group_by_company(vacancies: list[dict]) -> dict[str, int]: all_company = [] for v in vacancies: all_company.append(v.get('company')) company_count = Counter(all_company) return company_count def format_vacancy_short(vacancy: dict) -> str: salary_from = vacancy.get('salary_from') salary_to = vacancy.get('salary_to') if salary_from is not None and salary_to is not None: salary_str = f"от {salary_from} до {salary_to}" elif salary_from is not None: salary_str = f"от {salary_from}" elif salary_to is not None: salary_str = f"до {salary_to}" else: salary_str = "зарплата не указана" return (f"ID {vacancy.get('id')}: {vacancy.get('title')} в {vacancy.get('company')}, " f"{vacancy.get('city')} — {salary_str}\n") def save_filtered_results(vacancies: list[dict], filename: str) -> bool: try: with open(filename,"w") as file: file.writelines(format_vacancy_short(x) for x in vacancies) return 0 except: return 1 def main(): main_list=load_vacancies(input("Write path for json:")) filered_vacancies = filter_by_city(main_list,input("Write city")) skils_list=[] for i in range(int(input("Write number of skills: "))): skils_list.append(input(f"Write №{i + 1} skill: ")) filered_vacancies=filter_by_skills(filered_vacancies,skils_list) filered_vacancies = filter_by_salary(filered_vacancies,int(input("Write salary: "))) print("Уникальные компании: ", ", ".join(extract_unique_companies(filered_vacancies))) top_skills = extract_top_skills(filered_vacancies, 5) print(f"Топ-5 навыков:") for skill, count in top_skills: print(f" {skill}: {count} вакансий") print(f"\nСредняя зарплата: {calculate_average_salary(filered_vacancies):,.0f} руб.") for company, count in group_by_company(filered_vacancies).items(): print(f" {company}: {count} вакансий") if(save_filtered_results(filered_vacancies,input("Write where to save"))): print("Check your path") else: print("Everything is fine, the file is saved") if __name__ =="__main__": #вход проги main()