[PYTHON] 2. 정렬(Sort) 정리
목표
1.PYTHON의 Sort 사용 방법을 정리한다.
1. list.sort()
리스트를 제자리에서 수정하는 내장 함수 (리턴 값이 None이다)
- 사용 방법 및 예시
# 숫자 정렬
arr = [5,2,3,1,4]
arr.sort() # [1,2,3,4,5]
arr.sort(reverse=True) # [5,4,3,2,1]
arr.sort(key=lambda x : -x) # reverse와 동일
print(arr.sort()) # None (Sorted랑 혼동을 피하고자 None 반환)
# 글자 정렬 - 유니코드 순으로 정렬(사전순)
arr = ['Test','test','est','st','t']
arr.sort()
print(arr) # ['Test', 'est', 'st', 't', 'test']
print(ord('T')) #84
print(ord('t')) #116
# Key를 이용한 정렬 방법
# 문자열 길이가지고 정렬
arr = ['Test','test','est','st','t']
arr.sort(key= lambda x : len(x)) # ['t', 'st', 'est', 'Test', 'test']
# 문자열 마지막 값 가지고 정렬
arr = ['Tese','tesd','esc','sb','a']
arr.sort(key= lambda x : x[-1], reverse=True) # ['a', 'sb', 'esc', 'tesd', 'Tese']
arr.sort(key= lambda x : x[-1]) # ['a', 'sb', 'esc', 'tesd', 'Tese']
2. sorted()
모든 iterable을 받을 수 있음 (Return 값 존재)
- 사용 방법 및 예시
# Dict 정렬
datas={1: 'D', 6: 'B', 3: 'B', 4: 'E', 5: 'A'}
print(sorted(datas.items(),key=(lambda x:x[0])))
# [(1, 'D'), (3, 'B'), (4, 'E'), (5, 'A'), (6, 'B')]
print(sorted(datas.items(),key={lambda x:x[1]}))
# [(5, 'A'), (6, 'B'), (3, 'B'), (1, 'D'), (4, 'E')]
datas={1:{'data':'C','value':'x'},
2:{'data':'B','value':'y'},
3:{'data':'A','value':'z'}}
print(sorted(datas.items(),key=(lambda x : x[1]['data'])))
# [(3, {'data': 'A'}), (2, {'data': 'B'}), (1, {'data': 'C'})]
datas={1:{'data':'C','value':100},
2:{'data':'B','value':-1},
3:{'data':'A','value':5},
4:{'data':'A','value':6},}
print(sorted(datas.items(),key=(lambda x : (x[1]['data'],x[1]['value']))))
# [(3, {'data': 'A', 'value': 5}),
# (4, {'data': 'A', 'value': 6}),
# (2, {'data': 'B', 'value': -1}),
# (1, {'data': 'C', 'value': 100})]
# Tuple 정렬
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
print(sorted(student_tuples, key=lambda student: student[2])) # age 인자로 정렬
# Class Object 정렬
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
# sort by age
print(sorted(student_objects, key=lambda student: student.age))
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
3. Operator 모듈 함수
Operator 모듈에는 itemgetter(), attrgetter(), methodcaller()
from operator import itemgetter, attrgetter
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
print(sorted(student_tuples, key=itemgetter(2)))
# [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
4. 커스텀 Sort 함수
cmp_to_key 필요한 경우 import
from functools import cmp_to_key
def compare(a,b):
if a[1] > b[1]:
return 1
elif a[1] == b[1]:
if a[0] > b[0]:
return 1
elif a[0] < b[0]:
return -1
else:
return 0
else:
return -1
print(sorted([5, 2, 4, 1, 3], key=cmp_to_key(compare)))
결론
- Sorting을 하는 방법은 매우 다양하다
- 나중에 속도 부분도 확인해보자 (당연히 sorted보다 sort가 더 빠르겠지만)
추후 공부할 것
- 1. ValueError가 발생했을 때 처리하는 방법 (try,catch 예외 처리)
- 2. Sort()에 대해서 커스터마이징 하는 방법 공부하기
- 3. for/if문 조금 더 좋게 쓰는 방법 공부하기
- 4. 배열 슬라이싱 방법 공부하고 숙지하기
- 5. Python 깊은 복사, 얕은 복사 알아보기
- 6. Python 언어의 기본 동작 방식 알아보기 (스크립트형)
- 7. Python 컴프리헨션 공부하기
- 8. 튜플 자료형 공부하기
- 9. 딕셔너리 자료형 공부하기 (단일,복합(Nested))
- 10. 클래스 공부하기
- 11. 패키지 만들기
- 12. 정규표현식
- 13. 리스트 공부하기