text/Python

python dictionary sort 정리 (sort by key & value)

hoonzii 2021. 8. 24. 20:01
반응형

입흔파이썬로고

매번 헷갈리고 알고리즘 문제 풀때마다 찾아보길래 이번 기회에 블로그에 적음으로 찾는 수고를 덜고자 한다.

 

프로그래머스에서 이번에 위클리 챌린지라고 leetcode에서 하는것 처럼 매주 문제 하나씩 내는데 4주차 문제에서 dictionary를 sort해야하는 문제가 나왔다. 

 

  1. 3주차는 어려워서 건너뛰고 4주차 풀었다.
  2. 내가 생각하는 이 문제의 제일 중요한 부분은 dictionary 자료형의 sort 부분이다.

2번에 대해 자세히 서술해보면

구글에 "python dictionary sort" 를 검색했을때 가장 많이 나오는 답으로는 sort by value 다.

value값 크기 대소를 통해 sort 하는 방법이다.

# sort by value Ascending 
result = sorted(dictionary.items(), key=lambda x : x[1]) 

# sort by value Descending 
result = sorted(dictionary.items(), key=lambda x : x[1], reverse=True)

 

예제 하나만 보더라도 key 값으로 sort 할 경우 lambda 식에서 x[0] 으로 바꿔주면 되겠구나 하는 생각이 든다.

 

하지만, 이번 문제의 경우

value 값은 내림차순으로 

value 값중 가장 큰 값이 중복일 경우, key 값이 오름차순으로 정렬해 보여주기를 요구한다.

 

구글에 검색하기를 python dictionary sort by user function or custom function 으로 쳐봤으나

결과로 나온것중에 (이번문제에) 적당한 답은 없었다.

조금 더 찾아보던중 이번 문제를 해결할 수 있었던 stack overflow의 답을 찾아냈다.

 

ref : https://stackoverflow.com/questions/15371691/how-to-sort-a-dictionary-by-value-desc-then-by-key-asc

 

How to sort a dictionary by value (DESC) then by key (ASC)?

Just after discovering the amazing sorted(), I became stuck again. The problem is I have a dictionary of the form string(key) : integer(value) and I need to sort it in descending order of its inte...

stackoverflow.com

 

아름답게 한줄로 정리 된 코드

 

python 문법은 진짜 날 잡고 한번 쭉 훑어볼 필요가 있지 싶다.

매번 dictionary sorting 할 때마다 구글 뒤지는건 아니다 싶어서 알고리즘 문제 풀이겸 정리 해본다.

 

해당 문제에 대한 링크

ref : https://programmers.co.kr/learn/courses/30/lessons/84325

 

코딩테스트 연습 - 4주차

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부

programmers.co.kr

 

해당 문제에 대한 내 풀이

def solution(table, languages, preference):
    answer = ''
    # table 구성
    info_dic = dict()
    for info in table:
        info_list = info.split()
        lang_dict = dict()
        for i, lang in enumerate(info_list[1:len(info_list)]):
            lang_dict[lang] = (len(info_list) - (i+1))
        info_dic[info_list[0]] = lang_dict
        
    # prefernce 구성
    pre_dict = dict()
    for lang, score in zip(languages, preference):
        pre_dict[lang] = score
        
    # 각 직업군 점수 계산
    job_score = dict()
    for job in info_dic:
        sum_num = 0
        for lang in pre_dict:
            if lang in info_dic[job]:
                sum_num += pre_dict[lang] * info_dic[job][lang]
            else:
                sum_num += 0
        job_score[job] = sum_num
    
    # dictionary sort
    sort_list = sorted(job_score.items(), key=lambda x: (-x[1], x[0]))
    
    answer = sort_list[0][0]
    return answer
반응형