정렬 관련 파이썬 함수

Doil.Dev·2022년 6월 28일
0
post-thumbnail

오늘은 백준 문제풀이를 하며 활용했던 몇가지 정렬관련 함수를 정리해볼까 한드앙

람다(lambda)

람다 형식은 AutoCAD(설계프로그램)에서 쓰이는 Lisp 언어에서 물려받았다고 한다. 읽을 때는 람다라고 읽지만 'b'가 들어있다(묵음) 오타에 주의하자

lambda 매개변수 : 표현식
(lambda x,y: x + y)(10, 20)
>>>>> 30

위의 람다함수를 사용하지 않는다면 기본적으로 아래와 같은 형식을 취해야한다.

def plus(x,y):
	return(x+y)

좀 극단적으로 표현한 감이 없진 않지만

한마디로 람다는 복잡한 표현식을 한줄에 깔끔하게 나타낼수 있도록 도와주는 아주 좋은 함수다.

람다는 map()함수와 filter()함수와 같이 쓰일때 그 효과가 극대화 된다.

map(lambda 변수:식, 리스트)

map()함수는 리스트의 요소를 하나씩 꺼내어 함수에 넣고 리턴해준다.

list = [1, 2, 3, 4, 5]
a = list(map(int, list)
>>>> a = [1, 2, 3, 4, 5]

map()함수와 람다를 함께 사용하면 더 극적인 결과를 얻을 수 있다.

a = list(map(lambda x:x*2, range(4))) 
a = [0, 2, 4, 6]

위 코드를 보면
range(3) = 0부터 3까지
map() = 0부터 3까지 하나씩 꺼내서
lambda x:x2 에 넣고 list()로 돌려준다.
여기서 람다는 x라는 변수를 x
2에 넣는것.
결과는 위와 같다.

filter(lambda 변수: 조건, 리스트)

filter(함수, 리스트) 의 형태로 사용되는 필터함수는 그 이름대로 뭔가(참거짓)를 걸러주는 역할을 한다.
람다와 같이 사용하면 아래와 같은 기능을 할 수 있다.

a = list(filter(lambda x : x<3, range(5)))
a = [0, 1, 2]

0부터 4까지 하나씩 꺼내서 람다에 넣고 참이 나오면 그 수를 살려서 리스트에 넣고 거짓이면 필터링 해버리는 것이다.

filter(lambda x : x%2, range(10))
를 사용하면 홀수를 찾는 함수를 한줄로 표현할 수 있다.
(0은 거짓이므로 걸러짐)

sort와 lambda

2개 이상의 항을 가진 리스트를 정렬하는 경우 람다를 활용할 수 있다.

 student = [
     ('john', 'A', 15),
     ('jane', 'B', 12),
     ('dave', 'B', 10),
 ]
 student.sort(key = lambda x : x[2])
 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

람다를 활용하여 나이순으로 정렬함.

람다 활용 문제 풀이

백준 11650 좌표 정렬하기
위 문제는 자칫 코드가 길어지고 보기 힘들어질 수 있다.
실제로 나또한 그랬고 좀 더 간결하고 좋은 코드를 찾기 위해 구글링한 결과
깨지고 부서져라 님 블로그에서 그 정답을 얻을 수 있었다.

import sys
n = int(sys.stdin.readline())
li = []
for i in range(n):
	li.append(list(map(int, sys.stdin.readline().split())
li.sort(key=lambda x:(x[0],x[1]))
for i in li:
	print(i[0], i[1])

자료 출처:
파이썬 공식 문서
디지털 플레이님 블로그
왕초보를 위한 파이썬

profile
우공이산

0개의 댓글