파이썬에서 정렬은 sort
, sorted
함수를 통해서 할 수 있습니다. 리스트의 경우 sort
메소드를 가지고 있습니다. 정렬함수를 내부에 가지고 있지 않더라도 sorted
함수를 통해서 정렬을 할 수 있습니다.
정렬을 위한 자료구조로는 list(리스트)
, Dictionary(딕셔너리)
를 이용하겠습니다. 리스트의 경우 sort
정렬 메소드를 가지고 있으며, 딕셔너리의 경우는 파이썬 정렬함수인 sorted
를 이용해서 정렬해주어야 합니다.
list.sort() 리스트 정렬하기
파이썬 list(리스트)
의 경우에는 이미 정렬함수가 내부에 구현이 되어있습니다. 호출방법은 list.sort()
입니다. 간단한 오름차순, 내림차순 정렬은 바로 할 수 있습니다.
myList = [3, 2, 1, 5, 4]
print(myList)
myList.sort()
print(myList)
myList.sort()
myList.sort(reverse=True) # reverse를 통해서 내림차순 가능
print(myList)
# 결과
# [3, 2, 1, 5, 4]
# [1, 2, 3, 4, 5]
# [5, 4, 3, 2, 1]
.sort()
의 경우 리스트 자체가 정렬이 되기 때문에 이전 값의 순서가 필요하다면 사용에 있어서 주의가 필요합니다. 그리고 반환값은 None
입니다.
myList = ['bb', 'ccc', 'a']
myList.sort(key=lambda k: len(k)) #lambda를 통해서 원하는 정렬 조건을 만들수 있다.
# or
myList.sort(key=len) # key에 바로 함수를 넣어줄 수 있다.
print(myList)
# 결과
# ['a', 'bb', 'ccc']
그런데 리스트에 숫자만 오는게 아닙니다. 여러가지 값들이 올 수 있기 때문에 상수로 값을 비교할 수 없을 경우에는 정렬을 할 수 가 없게 됩니다. 이럴경우에는 key
매개변수를 이용합니다. key
에 lambda
함수를 넣고 조건을 만듭니다.
k
임시로 정한 변수명이며 어떤이름으로 하셔도 무방합니다. k에는 정렬을 할때에 리스트의 값이 들어오게 됩니다. 현재 list(리스트)
에 문자가 있습니다. 그리고 문자의 길이로 정렬을 진행하여서 결과를 볼 수 있습니다.
람다함수에서 len('bb')
, len('ccc')
, len('a')
의 결과값을 반환하며 해당 값이 정렬의 기준값이 됩니다. 이런식으로 필요한 값으로 정렬이 필요한 경우 활용할 수 있습니다. 딕셔너리 정렬에서 추가적으로 해보겠습니다.
key
함수의 반환값이 정렬의 compare
기준이 됩니다.
sorted() 리스트 딕셔너리 값으로 정렬하기
list.sort()
함수와는 다르게 정렬된 자료구조를 반환하게 됩니다. 리스트에 딕셔너리가 있는 경우에 딕셔너리 안에 있는 특정한 값으로 정렬을 하고 싶을 수 있습니다.
students = [
{'name': 'minmong', 'score': 100},
{'name': 'donghyun', 'score': 88},
{'name': 'junyong', 'score': 91},
]
print(students)
sorted_students = sorted(students, key=lambda student: student['score'])
print(sorted_students)
# 결과값
# [{'name': 'minmong', 'score': 100}, {'name': 'donghyun', 'score': 88}, {'name': 'junyong', 'score': 91}]
# [{'name': 'donghyun', 'score': 88}, {'name': 'junyong', 'score': 91}, {'name': 'minmong', 'score': 100}]
방식은 크게 다르지 않습니다. lambda
함수에서 student
가 리스트에 저장된 딕셔너리가 됩니다. 그리고 반환값으로 'score'
키값으로 정렬이 된 것을 볼 수 있습니다.
students = [
{'name': 'c', 'score': 90},
{'name': 'a', 'score': 100},
{'name': 'b', 'score': 90},
]
print(students)
sorted_students = sorted(students, key=lambda student: student['score'])
print(sorted_students)
print(sorted(students, key=lambda student: (
student['score'], student['name'])))
# 결과값
#[{'name': 'c', 'score': 90}, {'name': 'a', 'score': 100}, {'name': 'b', 'score': 90}]
#[{'name': 'c', 'score': 90}, {'name': 'b', 'score': 90}, {'name': 'a', 'score': 100}]
#[{'name': 'b', 'score': 90}, {'name': 'c', 'score': 90}, {'name': 'a', 'score': 100}]
추가로 비교 조건을 여러가지를 사용할 수 있습니다. 먼저 점수로 비교를 한 후 이름으로 비교를 했습니다. 이름 비교시 보기 편하도록 'a'
, 'b'
, 'c'
로 하였습니다. 현재 90점 동점자가 있고 이때에 결과를 보겠습니다.
점수로만 정렬을 했을때에는 'c'
가 'b'
보다 앞에 있는 걸 볼 수 있지만 'name'
을 추가로 정렬하니 순서가 제대로 정렬 된것을 볼 수 있습니다.
정렬은 내가 원하는 상황에 따라서 다르게 적용되어야 하는 만큼 필요할때에 조건을 만들어서 넣으면 됩니다. 파이썬 문서를 참고하시면 필요한 기능을 좀 더 편리하게 찾을 수 있습니다.