[파이썬] 정렬 'sort()' vs 'sorted()'

2020. 7. 3. 00:04Python

sort 함수 X.sort(key = function(), reverse = False)

리스트(list) type에서 제공하는 함수이고, 리스트 내부에서 정렬된다.

1) X는 sort()가 적용되는 대상이다. X는 오직 리스트 자료형만 가능하다.

  • X = 리스트
  • X != 튜플
  • X != 문자열
  • X != 딕셔너리

2) sort()의 인자에는 아무것도 받지 않는다.

3) 반환되는 데이터는 없다 (None).
→ sort 함수가 정상적으로 실행됐는지 확인하려면 원본 데이터 X를 출력해서 확인해야 한다.


sorted 함수 sorted(순서가 있는 데이터, key=function(), reverse=False)

파이썬 내장함수이다. 즉, 리스트(list)나 문자열에서 제공하는 함수가 아니다.

1) sorted의 인자로 순서가 있는 데이터 자료형을 인자로 받는다

  • 리스트
  • 튜플
  • 문자열
  • 딕셔너리 ★단, key의 자료형이 동일해야한다★

2) 반환되는 데이터 자료형은 리스트이다

sortedList = sorted([1, 2, 3])
print(type(sortedList))
print(sortedList)
# <class 'list'>
# [1, 2, 3]


sortedTuple = sorted((1, 2, 3))
print(type(sortedTuple))
print(sortedTuple)
# <class 'list'>
# [1, 2, 3]


sortedString = sorted("hello")
print(type(sortedString))
print(sortedString)
# <class 'list'>
# ['e', 'h', 'l', 'l', 'o']


sortedDict1 = sorted({'b': 1, 'c': 2, 'a': 0, 'd': 3, 'e': 4})
print(type(sortedDict1))
print(sortedDict1)
# <class 'list'>
# ['a', 'b', 'c', 'd', 'e']


sortedDict2 = sorted({1:'b', 2:'b', 0:'a', 3:'d', 4:'e'})
print(type(sortedDict2))
print(sortedDict2)
# <class 'list'>
# [0, 1, 2, 3, 4]

 


파라미터 key

순서가 있는 데이터를 정렬할 때 사용되는 함수가 할당된다. key에 할당되는 함수는 순서가 있는 데이터의 각 요소에 적용된다. 즉, key function의 입력값은 순서가 있는 데이터의 각 요소(1개)이며, 이에 대한 반환값 1개를 가진다. 

직접 만든 클래스의 객체 또는 복잡한 클래스의 객체가 모여 있는 배열을 정렬하기 위해 특정 기준을 지정할 때 필요하다.

## Fruit 클래스 정의
class Fruit:
    def __init__(self, name, price, origin):
        self.name = name
        self.price = price
        self.origin = origin


## Fruit 객체 배열 fruit_objects 생성
fruit_objects = [Fruit('apple', 700, 'Daegu'), Fruit('banana', 2600, 'Philippine'), Fruit('orange', 500, 'Jeju')]

## 1. X.sort 사용
## Fruit의 price 기준으로 fruit_objects 오름차순 정렬
fruit_objects.sort(key = lambda x: x.price)

## 정렬된 fruit_objects 배열의 원소에 대응되는 name 출력
for fruit in fruit_objects:
    print(fruit.name, end=' ')
# 결과> orange apple banana 

print()

## 1. X.sort 사용
## Fruit의 origin 기준으로 fruit_objects 오름차순 정렬하여 sortedFruit에 저장
sortedFruit = sorted(fruit_objects, key = lambda x: x.origin)
for fruit in sortedFruit:
    print(fruit.name, end=' ')
# 결과> apple orange banana 

operator 라이브러리의 attrgetter함수 이용

from operator import attrgetter

class Puppy:
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.weight = weight


puppies = [Puppy('주디', 1, 2), Puppy('준돌', 3, 4), Puppy('교미', 2, 1)]


print('1. 정렬 기준: 이름')
sortedPuppies = sorted(puppies, key=attrgetter('name'))
for puppy in puppies:
    print(f'이름: {puppy.name}')
# 정렬 기준 이름
# 이름: 주디
# 이름: 준돌
# 이름: 교미


print('2. 정렬 기준: 나이')
puppies.sort(key=attrgetter('age'))
for puppy in puppies:
    print(f'이름: {puppy.name} | 나이: {puppy.age}')
# 2. 정렬 기준: 나이
# 이름: 주디 | 나이: 1
# 이름: 교미 | 나이: 2
# 이름: 준돌 | 나이: 3


print('3. 정렬 기준: 무게')
puppies.sort(key=attrgetter('weight'))
for puppy in puppies:
    print(f'이름: {puppy.name} | 무게: {puppy.weight}')
# 3. 정렬 기준: 무게
# 이름: 교미 | 무게: 1
# 이름: 주디 | 무게: 2
# 이름: 준돌 | 무게: 4