파이썬(Python)

[python] 특정 기준으로 리스트 정렬하기 (key = lambda)

zzoming 2023. 9. 29. 13:13

파이썬에서 배열을 정렬하기 위해서는 sorted()/sort()를 사용하여 내림차순,오름차순으로 정렬할 수 있습니다.

하지만 내가 원하는 특별한 기준으로 배열을 정렬하고 싶을 때는 key=lambda를 사용하면 됩니다.

 

1. Key가 하나일 때 

ex) x를 기준으로 정렬하기 (일반 오름차순)

참고로 문자열은 다음과 같이 정렬하면 사전순으로 정렬이 된다

arr = ['abc' , 'bac' ,'bca']
sorted(arr , key = lambda x : x)

 

ex) arr에 속하는 각 원소들을 x라고 생각했을 때, x[0]을 기준으로 정렬하기

arr = ['abc' , 'bac' ,'bca']
sorted(arr , key = lambda x : x[0])

 

2. Key가 여러개 일 때 

ex) x[0]을 기준으로 정렬하고 같을 경우 x[1]를 기준으로 정렬하기

arr = ['abc' , 'bac' ,'bca']
sorted(arr , key = lambda x : (x[0] , x[1]))

 

 

3. 내림차순 정렬하기 

ex) x[0]은 내림차순, x[1]는 오름차순을 기준으로 정렬하기

arr = ['abc' , 'bac' ,'bca']
sorted(arr , key = lambda x : -x[0] , x[1])

 

관련문제 

https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

sol)

💡이 문제에서는 key=lambda로 표현해 정렬할 수 있지만, 내가 이 문제에서 막힌 포인트는 name과 socres는 type이 다른데 어떻게 한번에 받아오냐는 것이였다. 이 부분에 대해서는 아래 개념을 참고했다.

gift = '장난감' , '운동화', '게임기'
print(gift) 

#실행결과
'장난감','운동화','게임기'

장난감과 나머지 운동화,게임기를 따로 입력받으려면 아래와 같이 두개의 입력으로 받을 경우 에러가 발생한다

toy , gift = '장난감','운동화','게임기'

따라서 gift가 튜플로 이루어져있다고 알려줘야 한다. 이때는 unpacking을 사용한다. 

unpacking : packing의 반대 개념으로 여러 개의 인자가 있는 하나의 객체를 여러개로 풀어준다. 

toy,*gift = '장난감','운동화','게임기'
print(toy)
pirnt(gift) 

#실행결과
장난감
운동화 게임기

10825번 : 국영수 풀이

n = int(input())
arr = []
for _ in range(n) :
	name,*scores = input().split()
    arr.append((name, *map(int,scores)))

#문제 조건대로 정렬
arr = sorted(arr,key=lambda x : (-x[1],x[2],-x[3],x[0]))

#이름만 가져오기
for a in arr :
	print(a[0])

 

💡매핑(mapping)이란 개념은 하나의 값을 다른 값으로 대응시키는 것을 의미. 지도를 뜻하는 map에서 나온 말이다. 지도에 표시한 정보가 현실 세계와 1:1로 대응하듯이, 매핑을 통해 하나의 값을 다른 값으로 1:1 대응 시키는 것을 의미한다.

 

map(function , iterable)
  • function : 각 요소에 적용할 함수
  • iterable : 함수에 적용할 데이터 집합