import json import os import csv 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_form')> min_salary] def extract_unique_companies(vacancies: list[dict]) -> list[str]: return {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}") def save_filtered_results(vacancies: list[dict], filename: str) -> bool: return def interface(): os.system('cls' if os.name == 'nt' else 'clear') print ("Your command:") print ("1. Load form json\n2. Filter by city\n3. Filter by skils\n4. Filter by salary") print ("5. Extract unique companies\n6. Extract top skills\n7. Calculate average salary") print ("8. Group by company\n9. Format vacancy short\n10. Save filtred results\n11. Exit") def user_chouse(user_input:int): match user_input: case 1: return load_vacancies(input("Path for json: ")) case 11: return case _: print ("Error uncorrecteble number") def main(): while (user_input != 11): interface() user_input = int(input("Chouse command: ")) user_chouse(user_input) if __name__ =="__main__": #вход проги main()