2 분 소요

:fire: 목표

1.PYTHON의 Sort 사용 방법을 정리한다.

:speech_balloon: 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']

:speech_balloon: 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)]

:speech_balloon: 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)]

:speech_balloon: 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)))

:memo: 결론

  1. Sorting을 하는 방법은 매우 다양하다
  2. 나중에 속도 부분도 확인해보자 (당연히 sorted보다 sort가 더 빠르겠지만)

:question: 추후 공부할 것

  • 1. ValueError가 발생했을 때 처리하는 방법 (try,catch 예외 처리)
  • 2. Sort()에 대해서 커스터마이징 하는 방법 공부하기
  • 3. for/if문 조금 더 좋게 쓰는 방법 공부하기
  • 4. 배열 슬라이싱 방법 공부하고 숙지하기
  • 5. Python 깊은 복사, 얕은 복사 알아보기
  • 6. Python 언어의 기본 동작 방식 알아보기 (스크립트형)
  • 7. Python 컴프리헨션 공부하기
  • 8. 튜플 자료형 공부하기
  • 9. 딕셔너리 자료형 공부하기 (단일,복합(Nested))
  • 10. 클래스 공부하기
  • 11. 패키지 만들기
  • 12. 정규표현식
  • 13. 리스트 공부하기
  1. 파이썬 공식 문서
  2. 파이썬 Sort 방식

태그:

카테고리:

업데이트: