Programming/python

파이썬 원하는대로 리스트 정렬하기 Python sort(), sorted()

방황하는 데이터불도저 2022. 12. 24. 00:57

파이썬에서 리스트 형태를 정렬할 수 있는 함수로 sort()와 sorted() 두가지가 있다.

먼저, sort()와 sorted()의 차이를 간단하게 말하면,
sort()는 기존에 선언한 변수를 update해주는 기능+정렬이고,
sorted()는 기존에 선언한 변수를 update하지 않고, 정렬된 결과만 보여주는 역할을 한다.

아래의 예시로 더 쉽게 이해해보자.

먼저 sort()
- 문법은 list.sort()이며, 내부 파라미터는 key=None과 reverse = False가 default로 설정되어 있다.
- reverse = True로 내림차순을 만들어준다.
- key 메쏘드는 아래에서 다시 다루겠다.

# 사용예시

list1 = [1, 10, -3, 4, -2, 2]
list1.sort()
list1      # output : [-3, -2, 1, 2, 4, 10]


list1 = [1, 10, -3, 4, -2, 2]
list1.sort(reverse=True)
list1      # output : [10, 4, 2, 1, -2, -3]

여기서 주의할 점은 list1 = list1.sort() 이런식으로 새로운 변수에 선언할 순 없다.
처음 설명했던 것처럼 객체 자체를 변경시키는 기능이 이미 있기때문이다.
이 코드를 실행시켜보면, 에러는 나지 않지만 None으로 선언되게 된다.

list1 = [1, 10, -3, 4, -2, 2]
list1 = list1.sort()
print(list1)  

# output: None

위와 같은 문법은 새로운 객체에 정렬된 리스트를 선언하고 싶은 경우에 사용되고 이 때, sorted() 함수를 써야한다.
sorted(iterable, key=None, reverse=False) --> iterable(list)를 제외한 인자(파라미터)는 sort() 함수와 같다.

list1 = [1, 10, -3, 4, -2, 2]
list1 = sorted(list1)
list1     # output : [-3, -2, 1, 2, 4, 10]

 

# 응용 (key)

sort, sorted에는 key라는 파라미터로 sort하는 기준을 직접 지정할 수 있는 기능이 있다.

예를 들어서, 규칙적인 네이밍에 숫자만 변경되는 문자열 리스트가 있다고 가정해보자.
그 문자열이 아래와 같이 뒤죽박죽 배열 되어있는 상황에서 어떻게 정렬을 할 수 있을까?

이 때, sort 함수의 key파라미터를 활용하면 간단하게 정렬할 수 있다.
key 파라미터에 입력할 수 있는 것은 callable function 형태의 변수이다. 쉽게말해서 값을 계산해주는 함수를 지정해야한다는 것이다. 입력하는 방법은 다음과 같다.

def getindex(text):
    return int(text.split('_')[-1].split('.')[0])
    
PATHLIST.sort(key=getindex)
PATHLIST

결과값


만약, 리스트의 형태가 아래와 같은 nested list라면,

tuple1 = [('class1', 'student1', 40),
          ('class1', 'student2', 20),
          ('class2', 'student3', 26)]

print("Nested List")
image_tuple

아래와 같이 lambda 기능을 활용하여 정렬할 수도 있다.

image_tuple.sort(key=lambda t:t[2])
image_tuple

또한, 1차적인 정렬 후에 동일한 값이 있을 때, 2차 정렬을 해줄 조건을 멀티로 달아줄 수도 있다.

 * sort() 정렬의 다중 조건식

tuple2 = [('class1', 'student1', 40, 100),
          ('class1', 'student2', 40, 80),
          ('class2', 'student3', 26, 90),
          ('class3', 'student4', 35, 88)]

tuple2

조건 1개일 때 결과

tuple2.sort(key=lambda x: (x[2], x[3]))  # 튜플형태로 조건을 넣어주기
tuple2.sort(key=lambda x: [x[2], x[3]])  # 리스트형태도 가능

tuple2

조건 2개일 때 결과