달나라 노트

Python Basic : sorted method를 이용한 dictionary 정렬, dictionary 정렬하기 본문

Python/Python Basic

Python Basic : sorted method를 이용한 dictionary 정렬, dictionary 정렬하기

CosmosProject 2022. 1. 16. 19:51
728x90
반응형

 

 

 

dictionary의 값들을 정렬하는 방법에 대해 알아보겠습니다.

 

 

 

 

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[0], reverse=False)

dict_test_sorted = dict(list_test_sorted)
print(dict_test_sorted)


-- Result
{1: 'e', 2: 'd', 3: 'c', 4: 'b', 5: 'a'}

위 예시를 봅시다.

초기 dict_test에 정의된 값들은 key가 1, 2, 3, 4, 5가 있는데 전혀 정렬이 되어있지 않습니다.

 

그래서 sorted method를 이용해서 정렬을 했더니 결과에서 보이는 것 처럼 dict_test_sorted의 key값이 1, 2, 3, 4, 5 순서대로 오름차순 정렬된 것을 볼 수 있습니다.

 

이것을 이해하려면 sorted method의 특성에 대해 알아야합니다.

 

Step 1.

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[0], reverse=False)

이 부분이 가장 중요한데 여기를 하나씩 봐보죠.

 

sorted method에는 기본적으로 3가지 인자가 필요합니다. (사실 생략해도 작동은 되지만 명확하게 설명하기 위해 인자들을 적었습니다.)

 

sorted method의 첫 번째 인자 --> dict_test.items()

이것은 sorted method를 적용할 대상입니다.

당연히 정렬을 하려면 어떤 것을 정렬할지가 있어야되겠죠.

 

근데 좀 이상합니다. dictionary를 정렬하려면 dict_test만 전달하면 될 것 같은데 왜 정렬할 대상에 dict_test가 아니라 dict_test.items()라고 적었을까요?

 

이를 간단하게 먼저 설명해보면 sorted method는 dictionary 자체에 직접적으로 적용할 수 없기 때문입니다.

그래서 dict_test.items() 의 형태로 items method를 이용해 dictionary안에 있는 key, value pair들을 list의 형태로 만들어서 sorted에 전달하여 key, value pair들을 list내에서 정렬하는 것이죠.

 

이게 무슨말인지 좀 더 살펴봅시다.

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

print(dict_test.items())


-- Result
dict_items([(3, 'c'), (5, 'a'), (4, 'b'), (1, 'e'), (2, 'd')])

dict_test에 items method를 적용한 결과를 print해보면 위와 같은 값이 나옵니다.

그 형태는 마치 dictionary 안에 있는 각각의 key, value pair를 tuple의 형태로 묶어서 list에 담아둔 형태와 같습니다.

 

즉, sorted method는 dictionary에 직접 적용할 수 없다보니, items method를 이용해서 dictionary의 key, value pair를 list에 담아둔 정보를 가지고 정렬하겠다는 의미죠.

 

 

 

sorted method의 두 번째 인자 --> key=lambda x: x[0]

sorted method의 key 옵션은 어떤 것을 기준으로 정렬할지를 나타냅니다.

 

[(3, 'c'), (5, 'a'), (4, 'b'), (1, 'e'), (2, 'd')]

sorted method의 첫 번째 인자로서 정렬을 할 대상은 위와 같습니다.

즉, sorted method는 (3, 'c'), (5, 'a'), (4, 'b'), (1, 'e'), (2, 'd') 라는 5개의 tuple을 보고 정렬을 해야합니다.

 

만약 정렬할 대상이 [1, 2, 3, 4, 5]같은 일반적인 값들만을 가진 list라면 그냥 그 값들 자체를 보고 정렬하면되지만

정렬을 위해 받은 값은 (3, 'c'), (5, 'a'), (4, 'b'), (1, 'e'), (2, 'd') 이 5개의 tuple입니다.

 

각각의 tuple은 값을 2개씩 가지고있으니 index=0인 값들을 비교하여 정렬할지 index=1인 값들을 비교하여 정렬할지를 정해줘야 하고 이를 위해 key라는 option을 명시해준 것입니다.

 

key=lambda x: x[0]

따라서 위 내용을 다시 해석해보면 다음과 같습니다.

"sorted method로 정렬할 요소들은 (3, 'c'), (5, 'a'), (4, 'b'), (1, 'e'), (2, 'd') 이렇게 5개가 있고, 이 5개의 tuple은 순차적으로 x라는 변수에 할당되어 정렬될거야. 다만 값들이 모두 tuple이니까 x[0] 즉, tuple의 index=0에 있는 값들을 기준으로 정렬해줘."

 

이해가 가시나요?

정렬할 값들이 tuple이고 각각의 tuple에는 요소가 2개씩 있다보니 tuple에 있는 index=0인 값들을 기준으로 정렬할지 index=1인 값들을 기준으로 정렬할지 정해주는 부분입니다.

 

 

sorted method의 세 번째 인자 --> reverse=False

sorted method의 마지막 세 번째 인자는 reverse 옵션이며 오름차순/내림차순 정렬 여부를 결정해주는 부분입니다.

- reverse=False -> 오름차순 정렬(ascending sort)

- reverse=True -> 내림차순 정렬(descending sort)

 

 

 

 

 

자 이제 다시 원래 코드로 돌아와봅시다.

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[0], reverse=False)

dict_test_sorted = dict(list_test_sorted)
print(dict_test_sorted)


-- Result
{1: 'e', 2: 'd', 3: 'c', 4: 'b', 5: 'a'}

지금까지 sorted method에 들어가는 모든 인자들에 대해 이해해봤습니다.

 

근데 dictionary에는 직접적으로 sorted method를 적용할 수 없어서 dict_test.items()를 이용해 key, value pair를 전달했습니다.

 

즉, sorted method의 결과로 return되는 값도 dictionary가 아니라 [(1, 'e'), (2, 'd'), (3, 'c'), (4, 'b'), (5, 'a')] 이렇게 생긴 key, value pair라는 의미입니다.

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[0], reverse=False)
print(list_test_sorted)
print(type(list_test_sorted))


-- Result
[(1, 'e'), (2, 'd'), (3, 'c'), (4, 'b'), (5, 'a')]
<class 'list'>

위 코드에서는 sorted method의 결과를 list_test_sorted라는 변수에 할당하고있고, list_test_sorted 를 print해보았습니다.

그 결과는 우리가 예상한대로 key, value pair가 tuple로 묶이고 이러한 key, value pair가 list 속에 담아져있는 형태의 데이터가 return된 것을 알 수 있습니다.

 

다만 처음과는 다르게 key, value pair tuple들이 index=0의 위치에 있는 값인 1, 2, 3, 4, 5를 기준으로 정렬된 것을 볼 수 있죠.

 

우리는 이러한 key, value pair들의 tuple data를 원하는 것이 아니라 정렬된 dictionary 그 자체를 원하는 것이므로 key, value pair들의 tuple 데이터를 dictionary로 바꿔야 합니다.

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[0], reverse=False)

dict_test_sorted = dict(list_test_sorted)
print(dict_test_sorted)


-- Result
{1: 'e', 2: 'd', 3: 'c', 4: 'b', 5: 'a'}

그래서 list_test_sorted에 dict method를 적용해서 key, value pair tuple 데이터를 dictionary로 바꿔주고 있죠.

 

결과적으로 dict_test_sorted 변수를 print해보면 우리가 원한대로 dictionary의 key값 기준으로 오름차순 정렬된 새로운 dictionary를 얻을 수 있게 되었습니다.

 

 

- 참고

[(key1, value1), (key2, value2), ...] 이런 데이터에 dict method를 적용하면 자동으로 key, value pair로 인식해서 dictionary가 될 수 있음을 참고하면 좋습니다.

(dictionary에 items method를 적용했을 때 위처럼 key, value pair tuple 형태의 데이터가 나온다는 것을 생각해보면 위 내용도 당연한 얘기죠.)

 

 

 

 

 

 

 

 

 

 

그러면 dictionary의 value 값을 기준으로 정렬을 하려면 어떻게 해야할까요?

굉장히 간단합니다.

 

위에서 설명했던 sorted method의 두 번째 인자 --> key=lambda x: x[0] 부분을 다시 참고해봅시다.

 

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[1], reverse=False)

dict_test_sorted = dict(list_test_sorted)
print(dict_test_sorted)


-- Result
{5: 'a', 4: 'b', 3: 'c', 2: 'd', 1: 'e'}

그러면 위처럼 sorted의 key 옵션에서 lambda x: x[0]lambda x: x[1]로 바꿔주면 dictionary의 value 기준으로 정렬이 되는 것을 볼 수 있습니다.

 

다시 한번 설명해보면

dictionary의 key, value pair tuple 데이터가 순차적으로 lambda x 에 전달될거고 전달된 key, value pair tuple에서 index=1 (-> x[1])의 위치에 있는 값을 기준으로 정렬하라 라는 의미입니다.

 

 

 

 

 

아래 2개의 예시는 reverse를 True값으로 바꾼 예시입니다.

reverse=True로 설정하면 내림차순(descending) 정렬이 됩니다.

dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[0], reverse=True)

dict_test_sorted = dict(list_test_sorted)
print(dict_test_sorted)


-- Result
{5: 'a', 4: 'b', 3: 'c', 2: 'd', 1: 'e'}
dict_test = {
    3: 'c',
    5: 'a',
    4: 'b',
    1: 'e',
    2: 'd',
}

list_test_sorted = sorted(dict_test.items(), key=lambda x: x[1], reverse=True)

dict_test_sorted = dict(list_test_sorted)
print(dict_test_sorted)


-- Result
{1: 'e', 2: 'd', 3: 'c', 4: 'b', 5: 'a'}

 

 

 

 

 

 

728x90
반응형
Comments