Today I Learned/Python & Pandas

[Python] Sort dict values in list

하나719 2020. 9. 27. 17:01
반응형

Checkio 문제 출처: https://py.checkio.org/mission/bigger-price/solve/

문제 설명

dict타입을 가진 list에서 price가 높은 순서대로 limit 개수만큼 출력해라

 

예시)

input: data, limit

data = [
        {"name": "bread", "price": 100},
        {"name": "wine", "price": 138},
        {"name": "meat", "price": 15},
        {"name": "water", "price": 1}
    ]

limit = 2

output

 [
        {"name": "wine", "price": 138},
        {"name": "bread", "price": 100}
    ]

 

내 풀이

dict를 dataframe으로 변경해서 풀어주기위해서 pandas를 import 해주었다.

pandas 내장함수 sort_values를 사용해서 정렬해준뒤, head() 함수를 사용해서 limit 수만큼 짤라주었다.

그리고 output 형태를 맞추어주기 위해 to_dict 로 다시 dict 형태로 바꾸어주었다.

import pandas as pd

def bigger_price(limit: int, data: list) -> list:
    
    df=pd.DataFrame(data)
    return df.sort_values('price',ascending=False).head(limit).to_dict('records')

 

다른사람 풀이

sorted 라는 함수를 사용했다. 

python의 sorted 함수로 dict를 정렬하는 방법을 알아보자

def bigger_price(limit: int, data: list) -> list:

    return sorted(data, key=lambda x: -x['price'])[0:limit]

Sort dict valeus

1) sorted() + lambda

reverse=True 사용해서 내림차순

 

x = -x['price'] 로 내림차순

2) sorted() + itemgetter()

 

두 방법모두 key에 정렬하고자하는 기준값을 넣어주는것이 같다.

reverse 인자를 설정하면, 내림차순으로 변경할 수 있다.

lambda 함수를 쓸 때는 앞에 - 부호를 붙여서 내림차순으로 변경해줄 수 있지만 itemgetter() 함수 사용할때는 불가능하다.

 

3) limit 으로 짤라주기

리스트 형태이기 때문에 [:] 으로 슬라이싱 해줄수 있다.

 

데이터프레임으로 변경하지 않고, 파이썬만으로 dict 값을 정렬하고 추출해보았다.

반응형