[파이썬] 정렬 'sort()' vs 'sorted()'
2020. 7. 3. 00:04ㆍPython
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
'Python' 카테고리의 다른 글
[Python] f-string 소수점 자릿수 표기 방법 (0) | 2020.07.30 |
---|---|
[파이썬] 뒤집기: 'slicing' vs 'reversed()' vs 'reverse()' (0) | 2020.07.02 |
[파이썬] WSL/Ubuntu에서 version 변경하기 (0) | 2020.06.02 |