list안의 list 정렬하기.

박광수·2022년 2월 14일
0

list

list안에 list를 넣는 것이 가능하다. 이러면 행렬도 구현 가능하다. 행렬을 다룰 땐 Numpy라는 패키지를 사용하면 유용한 명령어가 많은 것 같다. 다음에 기회가 되면 공부해볼 예정.

A=[[1,5],[3,7],[2,4]]

이 경우에 그냥 sort 하면

A=[[1,5],[3,7],[2,4]]
A.sort()
print (A)
----------------------
[[1, 5], [2, 4], [3, 7]]

element의 앞에 해당하는 0번째 원소를 기준으로 정렬이 된다.

주의할 점은, A.sort()를 바로 다른 변수에 저장할 수 없다.
예를 들면

A=[[1,5],[3,7],[2,4]]
B=A.sort()
print (B)
-----------------------
None

이 방법으론 변수 B에 정렬된 A를 부여할 수 없다.

새로운 변수로 정렬된 list를 부여하고 싶을 땐 sorted()를 사용하자.

A=[[1,5],[3,7],[2,4]]
B=sorted(A)
print (B)
----------------------
[[1, 5], [2, 4], [3, 7]]

만약 주어진 list의 각 element에서 0번째가 아닌 1번째 element를 기준으로 정렬하고 싶다면 아래와 같이 key를 이용할 수 있다.

A=[[1,5],[3,7],[2,4]]
A.sort(key=lambda x : x[1])
print (A)
----------------------
[[2, 4], [1, 5], [3, 7]]

이 경우 각 element에서 1번째 element에 해당하는 5, 4, 7을 기준으로 정렬이 된 것을 볼 수 있다.

정렬은 오름차순이 기본 설정이지만 내림차순으로 정렬하고 싶을 땐 reverse=True를 추가해주면 된다.

A=[[1,5],[3,7],[2,4]]
A.sort(reverse=True, key=lambda x : x[1])
print (A)
----------------------
[[3, 7], [1, 5], [2, 4]]

만약 n번째 element를 기준으로 정렬하려할 때, n번째 element가 같은 두 element는 어떻게 정렬될까?

B=[[1,5],[3,9],[5,7],[3,7],[2,4]]
B.sort(key=lambda x : x[1])
print (B)
----------------------
[[2, 4], [1, 5], [5, 7], [3, 7], [3, 9]]

이와 같이 1번째 element 기준으로 정렬 할 때, 7로써 같은 두 element는 기존 list에서의 순서를 그대로 가져와서 정렬된다.

만약 [5,7], [3,7] 처럼 1번째 element가 같은 경우 0번째 element를 기준으로 오름차순 정렬을 하고 싶다면 다음과 같이 x[0]을 정렬의 두 번째 기준으로 입력하면 된다.

B=[[1,5],[3,9],[5,7], [3,7],[2,4]]
B.sort(key=lambda x : (x[1], x[0]))
print (B)
----------------------
[[2, 4], [1, 5], [3, 7], [5, 7], [3, 9]]

물론 내림차순도 가능하다.

B=[[1,5],[3,9],[5,7], [3,7],[2,4]]
B.sort(reverse=True, key=lambda x : (x[1], x[0]))
print (B)
----------------------
[[3, 9], [5, 7], [3, 7], [1, 5], [2, 4]]

만약 1번째 element를 기준으로 내림차순 배열을 하고, 1번째 원소가 같을 때 0번째 element를 기준으로 오름차순 배열을 하고 싶다면 다음과 같이 코딩하면 된다.
(0번째 element를 기준으로 먼저 오름차순배열한 후에 1번째 element 기준으로 내림차순 배열. 1번째 element가 같은 경우 기존 list 순서를 따라가기 때문에 미리 0번째 element를 기준으로 오름차순배열을 해놓았다.)
(혹시 한 명령어로 처리할 수 있는지는 잘 모르겠다.)

B=[[1,5],[3,9],[5,7],[3,7],[2,4]]
B.sort()
B.sort(reverse=True, key=lambda x : (x[1]))
print (B)
----------------------
[[3, 9], [3, 7], [5, 7], [1, 5], [2, 4]]

프로그래머스에서 문제풀다가 궁금해서 정리한 list안의 list 정렬하기.
이 문제 뿐만 아니라 다른 문제에서도 왕왕 쓰였지만
대표적인 문제 하나 소개한다.

https://programmers.co.kr/learn/courses/30/lessons/42889

내 코드는 다음과 같다.

def solution(N, stages):
    cnt=[]
    users=len(stages)
    acc=[users]
    defeat_rate=[]
    answer = []
    for i in range(1,N+2):
        cnt.append(stages.count(i))
        users=users-cnt[i-1]
        acc.append(users)
        if acc[i-1]==0:
            defeat_rate.append((i-1,0))
        else:
            defeat_rate.append((i-1, (cnt[i-1]/acc[i-1])))
    defeat_rate.sort(reverse=True, key=lambda x : (x[1]))
    for i in range(N+1):
        answer.append(defeat_rate[i][0]+1)
    answer.remove(N+1)
    return answer

defeat_rate.sort(reverse=True, key=lambda x : (x[1]))
이 한 줄을 완성하기까지 한참을 검색한 것 같다.

끝.

profile
박광수입니다.

0개의 댓글