89 lines
4.1 KiB
Python
89 lines
4.1 KiB
Python
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() |