관리 메뉴

솜씨좋은장씨

[Python] 내가 원하는 순서대로 리스트를 정렬하는 다양한 방법! 본문

Programming/Python

[Python] 내가 원하는 순서대로 리스트를 정렬하는 다양한 방법!

솜씨좋은장씨 2021. 12. 6. 15:09
728x90
반응형

개발을 하다보면 종종 리스트의 값들을 내가 원하는 순서대로 정렬하고 싶을 때가 있습니다.

각 리스트 속 리스트의 값들의 두번째 값을 기준으로 오름차순 정렬을 하고 싶은 경우 

또는 정말 내가 원하는 순서를 정해서 그 순서대로 정렬을 하고싶은 경우가 그럴 때 입니다.

1. 리스트 안에 리스트 형태로 값들을 가지고 있을 때 각 리스트 값의 2번째 값으로 정렬하고 싶은 경우

데이터의 형태가 아래와 같을 경우

my_data_list = [[1, 2], [2, 1], [3, 5], [4, 4], [6, 3]]

각 값의 2번째 값 ( 2, 1, 5, 4, 3 ) 을 기준으로 오름차순 정렬을 하고 싶다고 한다면

sort 또는 sorted와 lambda 를 활용하여 정렬하면 됩니다.

아래와 같이

my_data_list = sorted(my_data_list, key=lambda x: x[1])

또는

my_data_list.sort(key=lambda x: x[1])

방식으로 진행하면 됩니다.

 

key=lambda x: 로 작성하는데 여기서 x를 my_data_list의 값 하나 ( [1, 2] ) 로 생각하면 됩니다.

여기서 2번째 값을 기준으로 정렬하고 싶은 것이므로 x[1] 을 lambda x: 뒤에 붙여주면 [1, 2] 중에서 인덱스 1의 값인 2를 

활용하여 오름차순 정렬을 하게 됩니다.

 

위와 같이 정렬하게 되면 리스트의 값은

> [[2, 1], [1, 2], [6, 3], [4, 4], [3, 5]]

위와 같이 정렬된 형태로 바뀝니다.

 

만약, 내림차순으로 정렬하고 싶다! 한다면

my_data_list = sorted(my_data_list, key=lambda x: -x[1])
my_data_list.sort(key=lambda x: -x[1])

lambda x:  뒤에 붙는 값에 - 만 붙여주면 내림차순으로 정렬이 되게 됩니다.

2. 1과 같은 데이터 형태이면서 각 리스트 값의 2번째 값 기준 오름차순 1번째 값 기준 내림차순 정렬하고 싶은 경우

my_data_list = [[1, 2], [2, 1], [3, 5], [4, 4], [6, 3]]

위와 같이 1과 같은 데이터 형식에서 각 값의 2번째 값을 기준으로 오름차순, 1번째 값을 기준으로 내림차순 정렬을

하고싶은 경우와 같이 여러 조건이 걸려있는 정렬도 1번 방법을 응용하여 가능합니다.

my_data_list = sorted(my_data_list, key=lambda x: (x[1], -x[0]))
my_data_list.sort(key=lambda x: (x[1], -x[0]))

조건이 여러 가지 일 경우에는 lambda x: 뒤에 붙는 값을 여러 조건을 tuple에 담은 형태로 해주면 됩니다.

 

2번째 값을 기준으로 오름차순 정렬이므로 x[1] 

1번째 값을 기준으로 내림차순 정렬이므로 -x[0]

 

이 두가지 조건을 튜플에 담은 ( x[1], x[0] ) 을 lambda x: 뒤에 붙여주면 됩니다.

 

다만, 조건이 여러개일 경우에는 앞 조건에서 동일한 값이어서 순번이 애매할 경우에만 다음 조건에서 정렬이 되므로

이를 잘 생각하고 사용해야합니다.

3. 리스트 속 값을 내가 정한 순서로 정렬하는 방법

my_data_list = [2, 1, 3, 3, 3, 4, 1, 2, 2, 1]

만약 데이터가 위와 같이 정수의 나열일 경우

4 -> 2 -> 3 -> 1 의 순서로 정렬하고 싶은 경우가 있을 때가 있습니다.

이럴 경우에는 내가 원하는 순서를 dictionary 형태로 만든 다음 sorted와 sort를 활용하시면 됩니다.

먼저 4 -> 2 -> 3 -> 1 을 나타내는 dictionary를 하나 만들어줍니다.

priority_dict = {4: 0, 2: 1, 3: 2, 1: 3}

그 다음 sorted 또는 sort와 lambda를 활용하여 정렬을 해줍니다.

sorted(my_data_list, key=lambda x: priority_dict[x])
my_data_list.sort(key=lambda x: priority_dict[x])

그럼 결과가

> [4, 2, 2, 2, 3, 3, 3, 1, 1, 1]

위와 같이 4, 2, 3, 1 의 케이스로 정렬 됩니다.

 

여기서도 lambda 안의 priority_dict[x] 에 - 를 붙이면

sorted(my_data_list, key=lambda x: -priority_dict[x])

오름차순 내림차순 처럼 반대로 동작하는 것처럼 내가 정한 순서의 정확히 반대로 동작합니다.

 

다만 3번 방법에서의 주의 사항이 있다면

내가 원하는 순서를 정해놓는 dictionary에 내가 정렬을 원하는 리스트 안에 들어있는 모든 값이 포함되어있어야만 동작하며

그렇지 않을 경우

my_data_list = [2, 1, 3, 3, 3, 4, 1, 2, 2, 1, 5] // priority_dict에 없는 5 존재

priority_dict = {4: 0, 2: 1, 3: 2, 1: 3}

sorted(my_data_list, key=lambda x: -priority_dict[x])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-11-6cdbc7f7a9f7> in <module>
      3 priority_dict = {4: 0, 2: 1, 3: 2, 1: 3}
      4 
----> 5 sorted(my_data_list, key=lambda x: -priority_dict[x])

<ipython-input-11-6cdbc7f7a9f7> in <lambda>(x)
      3 priority_dict = {4: 0, 2: 1, 3: 2, 1: 3}
      4 
----> 5 sorted(my_data_list, key=lambda x: -priority_dict[x])

KeyError: 5

가차없이 KeyError 가 발생하는 것을 볼 수 있습니다.

 

3번 방법은 최근에 풀었던 백준의 빈도정렬 문제에서 활용하였습니다.

2021.12.04 - [Programming/코딩 1일 1문제] - [BaekJoon] 2910번 : 빈도 정렬 (Python)

 

[BaekJoon] 2910번 : 빈도 정렬 (Python)

코딩 1일 1문제! 오늘은 555일차 문제! 백준의 빈도 정렬 입니다. 2910번: 빈도 정렬 첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어

somjang.tistory.com

이외에 다른 방법이 또 있다면 또 공유할 예정입니다.

 

읽어주셔서 감사합니다.

Comments