1. sorted() 함수와 .sort() 메서드의 차이
sorted()는 데이터를 정렬시키는 함수이다. 이전 자료의 유형에서 리스트 자료를 정렬하는 메서드 .sort()에 대해 살펴본 적이 있다. sorted()와 sort()의 차이는 원본 데이터의 변화 유무에 차이가 있다.
메서드 .sort()는 리스트 원본 자체를 변화시키지만, sorted() 함수는 원본 리스트 그대로 놔두고 정렬된 리스트를 새롭게 생성한다. 그리고 .sort()는 리스트 자료만 정렬할 수 있지만, sorted()는 반복 가능한 컨테이너(리스트, 튜플, 딕셔너리 등) 자료를 정렬할 수 있다.
사용 방법은 sorted 함수 안에 정렬할 자료를 넣고, 옵션으로 내림차순(True)과 오름차순(False:)를 지정한다. 아무것도 지정하지 않으면 디폴트(default)로 오름차순으로 정렬한다.
sorted((리스트/튜플/집합/딕셔너리), key 옵션. reverse 옵션)
* key = 정렬 기준 함수
* reverse= False(default) : 오름차순, True: 내림차순
# 메서드 .sort() 사용: 리스트 원본을 바꿈
a = [2, 1, 5, 6, 9, 8, 3, 7, 4, 10]
b = a.sort()
a # b에 a를 정렬해 저장했음에도 a가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 됨.
# sorted() 함수 사용: 리스트 원본은 바뀌지 않음
a = [2, 1, 5, 6, 9, 8, 3, 7, 4, 10]
b = sorted(a) # 오름차순으로 정렬해 b에 저장: b = [2, 1, 5, 6, 9, 8, 3, 7, 4, 10]
c = sorted(a, reverse=True) # 내림차순으로 정렬해 c에 저장: c = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
a # a는 바뀌지 않음: a = [2, 1, 5, 6, 9, 8, 3, 7, 4, 10]
2. sorted() 함수와 딕셔너리 자료
무엇보다 sorted() 함수는 딕셔너리 자료를 정렬할 때 매우 유용하게 사용된다. 딕셔너릴 자료는 키(key)와 값(value)을 가지고 있는데 이 두 가지를 모두 이용해 정렬할 수 있다.
딕셔너리 자료에 .items() 메서드를 사용하면 키와 값이 튜플로 묶인 [(key1, value1), (key2, value2),...] 식의 리스트가 만들어진다. 이때 세 가지 옵션으로 정렬이 가능하다.
- .items()로 정렬(sorted): key 값을 기준으로 key와 value로 구성된 튜플을 정렬
- key로 정렬하면 key로 정렬 후 key 출력
- values로 정렬하면 values로 정렬 후 value 값 출력
dict = { 3: 'James', 2: 'Chan', 1: 'Kim', 5: 'Youn', 4:'Tim'}
# key와 value를 튜플로 불러와 key를 기준으로 정렬
sorted(dict.items()) # [(1, 'Kim'), (2, 'Chan'), (3, 'James'), (4, 'Tim'), (5, 'Youn')]
# key를 기준으로 정렬 후 key 출력
sorted(dic.keys()) # [1, 2, 3, 4, 5]
# value를 기준으로 정렬 후 value 출력
sorted(dic.values()) # ['Chan', 'James', 'Kim', 'Tim', 'Youn']
3. sorted() 함수로 딕셔너리 데이터 정렬
위에서 딕셔너리 데이터를 정렬시키는 방법을 살펴보았다. 하지만 .items() 메서드를 이용해 key를 기준으로 키와 값을 동시에 정렬시킬 수는 있지만 value 값을 기준으로 정렬하는 방법은 언급하지 않았다. 당연히 그러한 메서드는 존재하지 않기 때문이다.
그런데 텍스트 분석을 하다 보면 value 값을 기준으로 key와 value 를 동시에 정렬할 경우가 발생한다. 보통 텍스트 분석에서 key는 단어 위치, value는 해당 키워드로 구성되기 때문에 value 값을 불러올 필요성이 있다.
value 값을 가지고 딕셔너리 데이터를 정렬하기 위해서는 key라는 파라메터를 이용하는 방법이 있다. 정렬하는 기준을 key=’정렬함수”로 옵션을 추가하는 방법이다.
딕셔너리 데이터에서 value 값을 기준으로 정렬하기 위해 key 로 활용할 수 있는 함수는 두 가지가 있다. 첫 번째 방법은 operator 모듈의 itemgetter 함수를 이용하는 것이다. itemgetter는 컨테이너 자료(리스트, 튜플, 딕셔너리 등)에서 사용할 수 있으며, 해당 자료의 인덱스를 지정할 수 있다.
예를 들어 [(’a’, 1), (’b’, 2), (’c’, 2)] 이라는 튜플로 이뤄진 리스트가 있다면, itemgetter(0)는 각 객체의 첫 번째(index=0) 값인 [’a’, ‘b’, ‘c’]를 의미하고, itemgetter(1)은 각 객체의 두 번째 값인 [1, 2, 3]을 가리킨다. 이를 이용하면 딕셔너리 자료를 value 값을 기준으로 정렬할 수 있다.
.items() 메서드를 이용해 key와 value를 구분하면 key는 튜플의 첫 번째 자리[0], value는 튜플의 두 번째 자리[1]에 위치한다. 따라서 value 값의 인덱스 1을 이용해 itemgetter(1)을 sorted() 함수의 파라미터를 적용하면 다음과 같다.
# (itemgetter(1) 사용) key와 value를 튜플로 불러와 key를 기준으로 정렬
from operator import itemgetter
sorted(dict.items(), key=itemgetter(1)) # [(2, 'Chan'), (3, 'James'), (1, 'Kim'), (4, 'Tim'), (5, 'Youn')]
sorted(dict.items(), key=itemgetter(1), reverse= True) # [(5, 'Youn'), (4, 'Tim'), (1, 'Kim'), (3, 'James'), (2, 'Chan')]
lambda 함수를 이용하면, itemgetter() 함수처럼 value 값의 인텍스를 지정해 정렬할 수 있다. dict.items()로 튜플 객체로 저장된 리스트를 만들고, 튜플의 첫 번째 key 값([0]), 두 번째 value 값([1])을 선택하면 된다.
# (lambda x[1] 함수 사용) key와 value를 튜플로 불러와 key를 기준으로 정렬
dict = { 3: 'James', 2: 'Chan', 1: 'Kim', 5: 'Youn', 4:'Tim'}
sorted(dict.items(), key=lambda x : x[1]) # items에서 value 값 선택
'파이썬' 카테고리의 다른 글
[ 코랩과 파이썬 ] 16. python random 모듈에서 sample, choices, choice, shuffle 함수로 데이터 추출하기 (2) | 2023.01.30 |
---|---|
[ 코랩과 파이썬 ] 15. python random 모듈로 난수 생성하기(randint, uniform, randrange 포함) (0) | 2023.01.27 |
[ 코랩과 파이썬 ] 13. python 필터 filter 함수 (isinstance 함수 포함) (0) | 2023.01.25 |
[ 코랩과 파이썬 ] 12. python 람다 lambda 함수와 맵 map 함수 (0) | 2023.01.17 |
[ 코랩과 파이썬 ] 11. python 함수 def 와 매개변수, 전역변수와 지역변수 (2) | 2023.01.13 |