소프트웨어에 대한 모든 것

[파이썬] sorted() 정렬 함수 파헤치기 본문

파이썬

[파이썬] sorted() 정렬 함수 파헤치기

앤테바 2022. 2. 24. 09:13
반응형

이터레이터로부터 새로운 정렬된 리스트를 마드는 sorted() 내장 함수가 있습니다.

sorted() 함수의 다양한 사용법을 알아보겠습니다.

 

Syntax

첫번째 인자 - 이터러블 객체 (list, dict, tuple 등)

두번째 인자 - 정렬을 결정할 함수를 지정

세법째 인자 - default는 오름차순

sorted(iterable, key=key, reverse=reverse)

 

오름차순 정렬

숫자 리스트를 오름차순으로 정렬합니다.

sorted()는 정렬된 객체를 반환합니다.

nums = [20, 9, 12]

# 오름차순 정렬
sorted_nums = sorted(nums)

print(sorted_nums)

출력

[9, 12, 20]

내림차순 정렬

reverse를 인자는 default False로 설정되어 있어서 오름차순 정렬이지만 이를 True로 변경하면 내림차순으로 정렬 가능합니다.

nums = [20, 9, 12]

# reverse를 True로 설정해서 내림차순 정렬
sorted_nums = sorted(nums, reverse=True)

print(sorted_nums)

출력

[20, 12, 9]

문자열 오름차순/내림차순 정렬

당연히 문자열도 sorted()를 이용해서 정렬이 가능합니다.

names = ['james', 'adele','michael', 'jack', 'kale']

# 오름차순 정렬
asc_names = sorted(names)

# 내림차순 정렬
des_names = sorted(names, reverse=True)

print('오름차순 : ', asc_names)
print('내림차순 : ', des_names)

출력

오름차순 :  ['adele', 'jack', 'james', 'kale', 'michael']
내림차순 :  ['michael', 'kale', 'james', 'jack', 'adele']

딕셔너리 정렬

딕서녀리도 정렬 가능합니다.

키로 정렬, value로 정렬, items()를 이용한 정렬 등...

names = {'james': 42, 
         'adele': 29, 
         'michael': 15, 
         'jack': 63, 
         'kale': 41}

# 딕서녀리의 키만 정렬
ret = sorted(names.keys())
print('키 정렬 : ', ret)

# 딕서녀리의 value 정렬
ret = sorted(names.values())
print('value 정렬 : ', ret)

# items()에 대해서 key로 정렬
ret = sorted(names.items())
print('items()에 대한 key로 정렬 : ', ret)

# items()에 대해서 value(나이)를 내림차순으로 정렬
ret = sorted(names.items(), key=lambda x: x[1], reverse=True)
print('나이 내림차순 정렬 : ', ret)

출력

키 정렬 :  ['adele', 'jack', 'james', 'kale', 'michael']
value 정렬 :  [15, 29, 41, 42, 63]
items()에 대한 key로 정렬 :  [('adele', 29), ('jack', 63), ('james', 42), ('kale', 41), ('michael', 15)]
나이 내림차순 정렬 :  [('jack', 63), ('james', 42), ('kale', 41), ('adele', 29), ('michael', 15)]

리스트 다중 정렬 (multiple sort)

하나의 필드가 아닌 2개 이상으 필드로도 정렬 가능 합니다.

sorted() 함수의 key 인자에 정렬 함수를 활용하는 것입니다.

 

예를 들면,

이름, 키로 구성된 데이터가 있을 때,

키가 가장 큰 순서대로 나열하고, 키가 동일하면 이름 오름차순으로 정렬하는 경우입니다.

그렇다면, 키는 내림차순, 이름 오름차순 입니다.

 

코드르 보시죠.

# 이름, 키
names = [['james', 176], 
         ['adele', 175], 
         ['michael', 179], 
         ['jack', 171], 
         ['kale', 179]
        ]

# 키 내림차순, 이름 오름차순 정렬
ret = sorted(names, key=lambda x: (-x[1], x[0]))

print('키 내림차순, 이름 오름차순 : ', ret)

출력

키 내림차순, 이름 오름차순 :  [['kale', 179], ['michael', 179], ['james', 176], ['adele', 175], ['jack', 171]]

클래스 다중 정렬 (sorting by multiple fields)

클래스 또한 다중 정렬이 가능합니다.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
students = []

# 학생 객체 생성 및 추가
students.append(Student('kyle', 22))
students.append(Student('gupy', 21))
students.append(Student('adele', 22))
students.append(Student('melo', 26))
students.append(Student('jack', 22))

# 나이 오름차순 정렬, 이름 오름차순 정렬
sorted_students = sorted(students, key=lambda student: (student.age, student.name))

for student in sorted_students:
    print(student.name, student.age)

출력

gupy 21
adele 22
jack 22
kyle 22
melo 26

list.sort() vs sorted() 누가 빠를까요?

list.sort()와 sorted() 함수.. 누가 더 빠를가요??

 

10만개의 random한 실수 값 정렬 비교 했을 때, lost.sort()가 약 6배 빠르네요.

import numpy as np

%timeit sorted(np.random.rand(100000))

# 출력 결과
# 36.7 ms ± 263 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


%timeit np.random.rand(100000).sort()

# 출력 결과
# 6.6 ms ± 32.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

 

 

반응형
Comments