일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- list
- google apps script
- c#
- string
- array
- Python
- Redshift
- Google Spreadsheet
- hive
- GIT
- math
- Kotlin
- Java
- Tkinter
- PySpark
- SQL
- django
- gas
- PANDAS
- dataframe
- Google Excel
- Github
- 파이썬
- matplotlib
- Apache
- numpy
- PostgreSQL
- Mac
- Excel
- Today
- Total
달나라 노트
Python Basic : sorted method를 이용한 dictionary 정렬, dictionary 정렬하기 본문
Python Basic : sorted method를 이용한 dictionary 정렬, dictionary 정렬하기
CosmosProject 2022. 1. 16. 19:51
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'}