정렬 기술

YangJiWon·2020년 9월 2일
0

python

목록 보기
10/12

리스트의 sort 메소드

  • 리스트의 한 요소를 정렬하는 기술은 아래와 같이 작성하면 됩니다.
ns = [3, 1, 4, 2]
ns.sort() # 1, 2, 3, 4
ns.sort(reverse = True) # 4, 3, 2, 1
  • 하지만 정보가 묶여 있느 상황에서는 어떻게 정렬을 해야할까요?
    ns = [('Yoon', 33), ('Lee', 12)]

  • 먼저 나이 기준으로 오름차순 정렬을 해보면,

ns = [('Yoon', 33)], ('Lee', 12), ('Park', 29)]
def age(t):
    return t[1] # 나이를 반환하는 함수

ns.sort(key = age) # 매개변수 key에 함수 age를 전달
print(ns)
# [('Lee', 12), ('Park', 29), ('Yoon', 33)]
  • 내림차순 정렬을 하려면 아까처럼 reverse = True를 통해 내림차순 정렬을 실행할 수 있습니다.
  • 이번에는 이름을 기준으로 정렬을 해보면,
ns = [('Yoon', 33)], ('Lee', 12), ('Park', 29)]
def name(t):
    return t[0] # 이름을 반환하는 함수

ns.sort(key = name)
print(ns)
# [('Lee', 12), ('Park', 29), ('Yoon', 33)]
  • 하지만 이런 경우에 함수를 만들기 보다는 람다식을 작성해서 전달하는 것이 편리하고 가독성도 좋습니다.
ns = [('Yoon', 33)], ('Lee', 12), ('Park', 29)]

ns.sort(key = lambda t : t[1])
print(ns)
# [('Lee', 12), ('Park', 29), ('Yoon', 33)]
  • 이번에는 문자열의 길이로 정렬을 해보겠습니다.
names = ['Julia', 'Yoon', 'Steven']
names.sort(key = len) # ['Yoon', 'Julia', 'Steven']
  • 이번에는 튜플로 이루어진 리스트를 두 수의 합으로 정렬을 내림차순으로 해보겠습니다.
nums = [(3, 1), (2, 9), (0, 5)] # 두 수의 합은 각각 4, 11, 5
nums.sort(key = lambda x : x[0] + x[1], reverse = True)
print(nums) # [(2, 9), (0, 5), (3, 1)]

sorted 함수

  • sort 함수는 리스트 자체를 수정해버리고 sorted 함수는 기존의 것은 정렬 하지 않고 정렬된 결과를 반환합니다.
org = [('Yoon', 33)], ('Lee', 12), ('Park', 29)]

cpy = sorted(org, key = lambda t : t[1])
print(cpy)
# [('Lee', 12), ('Park', 29), ('Yoon', 33)]
print(org)
# [('Yoon', 33)], ('Lee', 12), ('Park', 29)]
  • 튜플에는 sort메소드가 존재하지 않습니다. 그 이유는 불변 객체이기 때문입니다.
    하지만 sorted 함수는 정렬된 사본을 새로 생성하기 때문에 iterable객체면 무엇이든 전달할 수 있습니다.
org = (3, 1, 2)
cpy = sorted(org)
print(org) # (3, 1, 2)
print(cpy) # [1, 2, 3]
  • sorted 함수로 반환받는 객체는 리스트입니다. 그래서 튜플로 객체를 받고 싶으면 형변환을 해주면 됩니다.
org = (3, 1, 2)
cpy = tuple(sorted(org))
print(org) # (3, 1, 2)
print(cpy) # (1, 2, 3)
profile
데이터데이터데이터!!

0개의 댓글