본문 바로가기
Python/기초

리스트 정렬 한 글로 끝내기: sort와 sorted 차이 & 여러 조건 정렬 등

by 모두의 케빈 2023. 10. 12.

 

 

리스트 정렬: sort와 sorted


리스트 정렬 한 글로 끝내기

 

파이썬에서 리스트를 정렬하는 방법에는 크게 두 가지가 있습니다. 하나는 내장함수인 sorted()를 사용하는 것이고, 다른 하나는 리스트 메서드(멤버 함수)인 sort()를 사용하는 것입니다.

 

 

내장함수 sorted(iterable, key, reverse)

 

파이썬에는 별도의 모듈을 import 하지 않아도 사용할 수 있는 몇 가지 유용한 함수가 있습니다. 이를 내장함수라고 합니다. 그중에서 대표적인 것이 sorted()입니다.

 

sorted()는 iterable을 인자로 받아서 결괏값으로 iterable를 반환합니다. 즉, sorted()는 리스트 외에도 iterable 객체라면 모두 사용할 수 있습니다.

 

기초적인 사용법을 알아보겠습니다.

 

import random

li = [random.randint(0,10) for _ in range(5)]

print(li)
print(sorted(li))

>>>>> 실행 결과
[6, 7, 2, 9, 7]
[2, 6, 7, 7, 9]

 

 

문자열도 iterable이므로, sorted() 함수를 적용할 수 있습니다.

 

s = "cxznjkhqkwhqekzxmcjd"
print(' '.join(sorted(s)))

>>>>> 실행 결과:
c c d e h h j j k k k m n q q w x x z z

 

 

리스트 메서드(멤버 함수) sort(self, reverse, key)

 

sort()는 리스트 메서드로, 리스트에서만 적용 가능합니다. 다른 iterable 객체에서는 사용할 수 없습니다. 또한 별도로 반환되는 값이 없기 때문에, 정렬한 결과를 새로운 리스트로 할당하는 경우가 아닌 경우에는 sort()를 사용하셔도 됩니다.

 

# sort() 사용법
li = [random.randint(0,10) for _ in range(5)]
print(li)
li.sort()
print(li)

>>>>> 실행 결과:
[2, 2, 8, 2, 0]
[0, 2, 2, 2, 8]

 

 

 

 

특정 조건 & 기준으로 리스트 정렬하기


key 인자를 활용한 정렬

 

단순 오름 또는 내림차순 정렬이 아니라, 특정 기준으로 리스트를 정렬해야 하는 경우가 있습니다. 이럴 때 key 인자를 사용합니다. sorted()와 sort() 모두 key 인자가 있습니다. key는 함수를 인자로 받습니다.

 

예시를 보시면 이해가 빠르실 겁니다. 절댓값이 작은 순으로 정렬해 보도록 하겠습니다.

 

def abs_value(x):
    return abs(x)

li = [random.randint(-10,10) for _ in range(5)]
print(li)
li.sort(key = abs_value)
print(li) 

>>>>> 실행 결과
[-6, -6, -4, 8, 1]
[1, -4, -6, -6, 8]

 

 

위의 예시를 lambda와 sorted() 함수를 사용하여 더 간단히 줄여보겠습니다.

 

li = [random.randint(-10,10) for _ in range(5)]
print(li)
print(sorted(li, key = lambda x:abs(x)))

>>>>> 실행 결과:
[2, 8, 4, -6, 6]
[2, 4, -6, 6, 8]

 

 

참고로 내림 차순으로 정렬하고 싶다면 reverse 인자에 True값을 전달하면 됩니다.

 

li = [random.randint(-10,10) for _ in range(5)]
print(li)
print(sorted(li, key = lambda x:abs(x),reverse = True))

>>>>> 실행 결과:
[-5, 9, -6, 10, -2]
[10, 9, -6, -5, -2]

 

 

 

 

2차원 리스트의 정렬 및 여러 조건으로 리스트 정렬하기


2차원 리스트 정렬하기

 

 

조금 더 활용하면 2차원 리스트를 세밀하게 정렬할 수 있습니다. 예를 들면, 각 원소의 첫 번째 값을 기준으로 내림차순 정렬을 하면 아래와 같이 코딩할 수 있습니다.

 

먼저 2차원 리스트를 만들어 보겠습니다. 편의상, 리스트 안에 튜플이 있는 iterable 객체로 만들겠습니다.

 

l1 = [random.randint(-10,10) for _ in range(5)]
l2 = list("beadc")
li = list(zip(l1,l2))

>>>>> 실행 결과:
[(-1, 'b'), (-8, 'e'), (-1, 'a'), (-4, 'd'), (4, 'c')]

 

위의 리스트를 숫자 또는 문자 기준으로 오름차순 정렬하면 아래와 같습니다.

# 첫 번째 원소, 숫자 기준 오름차순 정렬
print(sorted(li, key = lambda x:x[0]))

# 두 번재 원소, 알파벳 기준 오름차순 정렬
print(sorted(li, key = lambda x:x[1]))


>>>>> 실행 결과:
[(-8, 'e'), (-4, 'd'), (-1, 'b'), (-1, 'a'), (4, 'c')]    
[(-1, 'a'), (-1, 'b'), (4, 'c'), (-4, 'd'), (-8, 'e')]

 

 

여러 조건으로 리스트 정렬하기 

 

두 가지 이상의 조건으로 리스트를 정렬하려면 key에 전달되는 함수의 return 값을 튜플 형태로 묶으면 됩니다. 예를 들어, 절댓값이 작은 순으로 정렬 후, 절댓값이 같은 값은 원래의 값이 작은 순으로 정렬해 보겠습니다. 

 

# 두 가지 이상의 조건으로 정렬하기: 절대값 작은 순 & 절대값이 같다면 일반 값이 작은 순
li = [random.randint(-10,10) for _ in range(15)]
print(li)
li.sort(key = lambda x:(abs(x), x)) 
print(li)

>>>>> 실행 결과:
[7, -9, 5, -4, -6, -10, 8, -1, 1, -4, -9, 0, 4, -6, -4]   
[0, -1, 1, -4, -4, -4, 4, 5, -6, -6, 7, 8, -9, -9, -10]

 

 

하나의 조건은 내림차순, 다른 조건은 오름차순 정렬도 할 수 있습니다. 절댓값이 작은 순(내림차순) 정렬 후, 절댓값이 같다면 원래의 값이 큰 값(오름차순)으로 정렬해 보겠습니다.

 

# 한 쪽은 오름차순, 한 쪽은 내림차순
# 절대값 작은 순 & 절대값이 같다면 일반 값이 큰 순
li = [random.randint(-10,10) for _ in range(15)]
print(li)
li.sort(key = lambda x:(abs(x), -x)) 
print(li)


>>>>> 실행 결과:
[-9, 10, 3, 2, 10, -8, -7, -3, 6, 8, 6, 6, 6, -2, -7]     
[2, -2, 3, -3, 6, 6, 6, 6, -7, -7, 8, -8, -9, 10, 10]

 

 

댓글