[py] sort/sorted

이혜윤·2023년 1월 13일
2

py

목록 보기
3/6

1. sort 함수 설명, 리스트 정렬 함수

1.1 sort 함수 기본

list.sort()

list.sort() 메서드는 list 객체 자체를 정렬해주는 함수입니다.
리스트에만 사용이 가능합니다. list 객체의 멤버 함수, 즉 메서드입니다.

list.sort() 함수는 기본적으로 리스트를 오름차순으로 정렬해주는 기능을 합니다.

**추가 설명
새로운 정렬된 리스트를 반환하는 함수는 sorted 함수이고,
리스트 자체를 정렬시켜버리는 것은 sort 함수입니다.

1.2 sort 함수 예제

list_num = [33, 2, 81, -77, 44, 1, 10, 99, 5, 0, -2]
list_str1 = ['b', 'l', 'o', 'c', 'k', 'd', 'm', 'a', 's', 'k']
list_str2 = ['B', 'l', 'o', 'c', 'k', 'D', 'M', 'a', 's', 'k']

숫자 리스트 정렬
print("1. 숫자 리스트 정렬")
list_num.sort()
print(list_num)
`
문자열 리스트 정렬1 (소문자만)
print("\n2. 소문자 문자열 리스트 정렬")
list_str1.sort()
print(list_str1)

문자열 리스트 정렬2 (/소문자 포함)
print("\n3. 대소문자 문자열 리스트 정렬")
list_str2.sort()
print(list_str2)

  • 숫자리스트.sort() 의 결과
    숫자리스트를 보면 음수, 0, 양수 이렇게 작은 수부터 큰 수로 오름차순으로 정렬해주는 것을 볼 수 있습니다.

  • 소문자문자리스트.sort() 의 결과
    우리가 알고 있는 알파벳순 a, b, c, d, e 순서로 잘 정렬되는 것을 볼 수 있습니다.

  • 대소문자문자리스트.sort() 결과
    대소문자 리스트.sort()는 대문자 ABCD 순으로 다 나온 후에, 소문자 abcd 순으로 정렬이 되는 것을 볼 수 있습니다.
    이는, 문자 자체를 아스키코드 값에 대응해서 숫자로 판단하기 때문인데요.
    아스키코드표에 보면 대문자 A는 65번에 해당하고 소문자 a는 97번에 해당합니다.
    (구글에 '아스키코드표'라고 검색하면 표가 나옵니다)

즉, A~Z는 65~90 대역대에 존재하고 소문자 a~z는 97~122에 존재하게 됩니다.
여기서 문자의 sort() 기준은 아스키코드표에 각 문자에 대응하는 숫자에 따라 판단을 하기 때문에 65~90에 있는 대문자들을 쫘르륵 정렬한 후에, 97~122번에 있는 소문자가 오게 됩니다.


2. 파이썬 오름차순, 내림차순 정렬

list.sort(reverse=True)

리스트.sort() 함수에는 reverse 옵션(매개변수)이 존재합니다.
디폴트는 리스트.sort(reverse=False) 인 게 디폴트여서 리스트가 오름차순으로 정렬이 되는 것이고
리스트.sort(reverse=True)로 변경하면 리스트가 내림차순으로 정렬이 됩니다.

a = [3, 2, 8, 4, 1, 10, 99, 5]
b = [3, 2, 8, 4, 1, 10, 99, 5]
c = [3, 2, 8, 4, 1, 10, 99, 5]

기본값 (오름차순)
a.sort()
print("a.sort()")
print(a)

오름차순
b.sort(reverse=False)
print("\nb.sort(reverse=False)")
print(b)

내림차순
c.sort(reverse=True)
print("\nc.sort(reverse=True)")
print(c)

위처럼 세 가지 동일한 리스트가 있다고 할 때
sort(), sort(reverse=False), sort(reverse=True)로 정렬을 해보았습니다.

결괏값을 보셨다시피
sort(), sort(reverse=False)가 오름차순으로 정렬되고
sort(reverse=True)가 리스트를 내림차순으로 정렬하는 것을 볼 수 있습니다.


3. sorted

3.1

sorted(정렬할 데이터)

sorted(정렬할 데이터, reverse=?)

sorted(정렬할 데이터, key=?)

sorted(정렬할 데이터, key=?, reverse=?)

  • 리스트.sort()와 sorted(리스트)의 가장 큰 차이는
    리스트.sort() 는 본체의 리스트를 정렬해서 변환하는 것이고,
    sorted(리스트) 는 본체 리스트는 내버려두고, 정렬한 새로운 리스트를 반환하는 것

3.2 예제

3.2.1 sorted 함수 예제 : 리스트 정렬

a = [2, 4, 1, 9, 100, 29, 40, 10]
b = sorted(a)
c = sorted(a, reverse=True)
 
 
print(f'origin                  : {a}')
print(f'sorted(a)               : {b}')
print(f'sorted(a, reverse=True) : {c}')

정렬된 리스트 = sorted(기존 리스트)


3.2.2 sorted 함수 예제 : 딕셔너리 key 정렬

# 딕셔너리
d = dict()
d['a'] = 66
d['i'] = 20
d['e'] = 30
d['d'] = 33
d['f'] = 50
d['g'] = 60
d['c'] = 22
d['h'] = 80
d['b'] = 11
 
# 1. 딕셔너리 출력
print("\n1. 기본 딕셔너리")
print(d)
 
# 딕셔너리 키 정렬 오름차순(디폴트)
print("\n2. 키 정렬 sorted(d.items())")
f = sorted(d.items())
print(f)
 
# 딕셔너리 키 정렬 내림차순
print("\n3. 키 정렬 sorted(d.items(), reverse=True)")
g = sorted(d.items(), reverse=True)
print(g)
 
# 딕셔너리 키만 정렬 및 출력1
print("\n4. 키만 정렬 sorted(d.keys())")
h = sorted(d.keys())
print(h)
 
# 딕셔너리 키만 정렬 및 출력2
print("\n5. 키만 정렬 sorted(d)")
i = sorted(d)
print(i)


이렇게 딕셔너리의 키 값을 기준으로 정렬을 할 수 있습니다.
sorted(딕셔너리.items())을 이용해서 키값을 기준으로 정렬을 하고, value도 그게 맞게 따라가서 출력되도록 할 수 있고,

그게 아니라 딕셔너리의 key 만 필요하다면
sorted(딕셔너리.keys()) 혹은 sorted(딕셔너리)을 이용하면 잘 정렬되는 것을 볼 수 있습니다.

역시 보면 sorted 함수의 반환형은 딕셔너리라 하더라도 [] 대괄호로 묶여있는 걸 확인할 수 있습니다.
즉, sorted 함수의 반환형은 리스트 타입입니다. sorted 함수의 인자로 들어온 딕셔너리를 정렬해서 리스트 타입으로 반환해주는 것을 확인할 수 있습니다.

예제 2, 3번을 보면 딕셔너리의 key, value쌍들이 리스트 안에 각 튜플 타입으로 변환되어 들어가 있는 것을 볼 수 있습니다.
[('i', 20), ('h', 80), ('g', 60), ('f', 50), ('e', 30), ('d', 33), ('c', 22), ('b', 11), ('a', 66)] 전체적으로는 리스트로 감싸여 있고 리스트 안의 값으로 튜플 타입으로 되어있는 것을 볼 수 있습니다.
정리 : sorted 함수로 딕셔너리 정렬을 하게 되면, key, value가 각각 튜플로 묶이고 그것들의 리스트로 만들어서 반환해 주는 것을 알 수 있습니다.


3.2.3 sorted 함수 예제 : 딕셔너리 value 정렬 (operator 모듈 이용)

import operator
 
d = {'b': 400, 'f': 300, 'a': 200, 'd': 100, 'c': 500}
 
print('1. 원본 딕셔너리')
print(d.items())
 
 
print('\n2. 딕셔너리 정렬 : sorted(d.items())')
f = sorted(d.items())
print(f)
 
 
print('\n3. 딕셔너리 정렬 : sorted(d.items(), key=operator.itemgetter(1))')
g = sorted(d.items(), key=operator.itemgetter(1))
print(g)
 
 
print('\n4. 딕셔너리 정렬 : sorted(d.items(), key=operator.itemgetter(1), reverse=True)')
h = sorted(d.items(), key=operator.itemgetter(1), reverse=True)
print(h)


딕셔너리의 value를 기준으로 sorted함수를 이용하여 정렬을 하기 위한 첫 번째 방법입니다.
operator 모듈의 itemgetter 함수를 이용하여서 딕셔너리의 value 값에 접근을 하여 그 값을 기준으로 정렬해달라 할 수 있습니다.
아래와 같이 말이죠.
sorted(딕셔너리.items(), key=operator.itemgetter(1))


3.2.4 sorted 함수 예제 : 딕셔너리 value 정렬 (lambda 이용)

import operator
 
d = {'blockdmask': 400, 'equal': 300, 'apple': 200, 'dish': 100, 'cook': 500}
 
print('1. 원본 딕셔너리')
print(d.items())
 
 
print('\n2. 딕셔너리 정렬 : sorted(d.items())')
f = sorted(d.items())
print(f)
 
 
print('\n3. 딕셔너리 정렬 : sorted(d.items(), key=lambda x: x[1])')
g = sorted(d.items(), key=lambda x: x[1])
print(g)
 
 
print('\n4. 딕셔너리 정렬 : sorted(d.items(), key=lambda x: x[1], reverse=True)')
h = sorted(d.items(), key=lambda x: x[1], reverse=True)
print(h)

업로드중..
sorted 함수에서 딕셔너리 value를 기준으로 정렬을 하기 위한 두 번째 방법은 람다를 이용하는 것입니다.

sorted(딕셔너리.items(), key=lambda x: x[1]) 이를 이용해서 key=를 x로 세팅해주어서 정렬하도록 할 수 있습니다.

profile
구르미 누나

0개의 댓글

관련 채용 정보