파이썬에서 딕셔너리(dictionary)에 키와 값 형태로 데이터를 저장할 수 있습니다.
딕셔너리에 저장한 데이터는 키를 지정해 정렬을 할 수 있습니다.
정렬을 하기 위해서는 sort() 또는 sorted()를 사용합니다.
리스트와 다르게 sort()와 sorted()에는 인수를 지정해야 합니다.
지정하지 않고 정렬을 하는 경우에는 TypeError가 발생합니다.
딕셔너리 정렬
정렬을 하기 위해서는 딕셔너리에 공통적으로 가지고 있는 키를 지정해야 합니다.
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
l.sort(key=lambda x: x['Age'])
pprint.pprint(l)
# [{'Age': 20, 'Name': 'Bob'},
# {'Age': 30, 'Name': 'Charlie', 'Point': 70},
# {'Age': 40, 'Name': 'Alice', 'Point': 80}]
l.sort(key=lambda x: x['Name'])
pprint.pprint(l)
# [{'Age': 40, 'Name': 'Alice', 'Point': 80},
# {'Age': 20, 'Name': 'Bob'},
# {'Age': 30, 'Name': 'Charlie', 'Point': 70}]
Name과 Age는 딕셔너리에 모두 존재하기 때문에 정렬이 가능합니다.
하지만 Point는 없는 행도 있기 때문에 정렬을 할 때 키로 사용하면 에러가 발생합니다.
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
# l.sort(key=lambda x: x['Point'])
# KeyError: 'Point'
모든 행에 공통으로 설정되어 있지 않은 키로 정렬을 하고 싶은 경우에는 기본값을 설정해 줍니다.
기본값을 두 번째 인수를 지정합니다.
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
l.sort(key=lambda x: x.get('Point', 0))
pprint.pprint(l)
# [{'Age': 20, 'Name': 'Bob'},
# {'Age': 30, 'Name': 'Charlie', 'Point': 70},
# {'Age': 40, 'Name': 'Alice', 'Point': 80}]
l.sort(key=lambda x: x.get('Point', 100))
pprint.pprint(l)
# [{'Age': 30, 'Name': 'Charlie', 'Point': 70},
# {'Age': 40, 'Name': 'Alice', 'Point': 80},
# {'Age': 20, 'Name': 'Bob'}]
Point가 없는 행은 두 번째 인수에 지정한 기본값으로 정렬이 됩니다.
딕셔너리 역정렬
반대로 정렬하고 싶은 경우에는 reverse를 설정합니다.
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
l.sort(key=lambda x: x['Name'], reverse=True)
pprint.pprint(l)
# [{'Age': 30, 'Name': 'Charlie', 'Point': 70},
# {'Age': 20, 'Name': 'Bob'},
# {'Age': 40, 'Name': 'Alice', 'Point': 80}]
sorted
sort()를 사용해 딕셔너리를 정렬하면 원본 데이터가 정렬이 됩니다.
원본은 변하지 않고 정렬한 데이터를 취득하고 싶은 경우에는 sorted()를 사용합니다.
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
l_sorted = sorted(l, key=lambda x: x['Age'], reverse=True)
pprint.pprint(l_sorted)
# [{'Age': 40, 'Name': 'Alice', 'Point': 80},
# {'Age': 30, 'Name': 'Charlie', 'Point': 70},
# {'Age': 20, 'Name': 'Bob'}]
sorted()는 sort()와 사용 방법은 같습니다.
역정렬을 하고 싶은 경우에는 reverse를 설정하면 됩니다.
결과값을 따로 저장하고 싶은 경우에는 sorted()를 사용하면 됩니다.
댓글