티스토리 뷰

728x90
반응형

숫자형 리스트를 단일 값으로 병합하기

a = [1, 2, 3, 4, 5]처럼 숫자형으로 이루어진 리스트가 있을 때 이를 하나로 합치는 좀 더 우아한 코드를 만들어 보자.

>>> ''.join(str(e) for e in a)
'12345'

이 방식의 코드는 아무래도 가독성이 떨어지고 영 보기가 좋지 않다. 좀 더 깔끔한 방법은 없을까?

>>> ''.join(map(str, a))
'12345'

이 경우 임시 변수 e를 사용하지 않아 깔끔하며, map(str,로 이어지는 부분이 문자열로 변환을 암시하는 듯하여 가독성도 좋다. 코드 크기가 줄어듦은 물론이다.

>>> functools.reduce(lambda x, y: 10 * x + y, a, 0)
12345

이런 식으로 처리할 수 있을 것 같다. functools는 '함수를 다루는 함수'를 뜻하는 고계 함수(Higher-Order Function)를 지원하는 함수형 언어 모듈이며, 리트코드에서 기본적으로 import되어 있다. 여기서 reduce는 두 인수(Argument)의 함수를 누적 적용하라는 메소드다. 즉 다음의 코드를 살펴보자.

>>> functools.reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])

이 코드의 결과는 ((((1+2)+3)+4)+5)이다. 그러니까 15가 된다. 다시 앞서 코드 functions.reduce(lambda x, y: 10 * x + y, a, 0)의 결과를 살펴보면, 값 x에 계속 10을 곱하면서 자릿수 10의 n승 형태로 올려나가고 그 뒤에 y를 더해서 일의 자릿수를 채워나가는 방식이다. 즉 코드의 결과는 ((((1x10+2)x10+3)x10+4)x10+5)의 형태가 된다.

이외에도 좀 더 가독성을 높일 수 있도록 operator 모듈을 활용하는 방법도 있다. 이 경우 연산자 명칭을 reduce() 메소드의 파라미터로 지정할 수 있어 가독성이 매우 높다. 이 또한 고계 함수이기 때문에 이처럼 파라미터로 함수를 넘기는 것이 가능하다.

>>> from operator import add, mul
>>> functools.reduce(add, [1, 2, 3, 4, 5])
>>> functools.reduce(mul, [1, 2, 3, 4, 5])
120



출처
파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday
링크