최근에 파이썬으로 코드를 짜다가 긴 리스트를 동일한 크기로 나누는 방법이 생각이 안나서 당황했다. 이 기회에 코드를 정리해본다.
나의 목표는 아래와 같은 리스트를
my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
이렇게 바꾸는 거였다.
my_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k']]
앞에서부터 3개씩 끊어서 리스트로 묶어서 새로운 리스트의 리스트로 저장하는 거다. (3개씩 딱 떨어지지 않으면 마지막에는 남는 것들끼리 하나의 리스트로 한다.)
그리고 이걸 아래와 같이 단순한 방법으로 해결할 수 있다는 걸 알았다.
방법 1. yield 사용하기
yield는 generator의 일종이다. generator는 정해둔 순서대로 값을 생성하는 함수를 정의하면, 이 함수를 이용해 값을 하나씩 꺼내며 값을 생성해 내는 기능을 한다. (iterator의 한 종류라고 이해하면 된다. 어렵다.)
어쨌든 yield를 통해 함수를 짜면 아래와 같다.
my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] def divide_list(l, n): # 리스트 l의 길이가 n이면 계속 반복 for i in range(0, len(l), n): yield l[i:i + n] # 한 리스트에 몇개씩 담을지 결정 n = 3 result = list(divide_list(my_list, n)) print(result)
주의할 점은 divide_list 함수를 실행했을 때 generator 객체가 생성되므로 이를 list로 바꿔주어야 한다. 어렵다.
어쨌든 출력해보면 아래와 같이 잘 나온다.
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k']]
방법 2. list comprehension 사용하기
리스트 컴프리헨션은 별도로 반복문을 작성하지 않고, 리스트 내부에 작성하여 반복하는 거다. 이거 한 줄로 많은 걸 해결할 수 있는 우아한 방법이다.
코드는 아래와 같다.
my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] # 한 리스트에 몇개씩 담을지 결정 n = 3 result = [my_list[i * n:(i + 1) * n] for i in range((len(my_list) + n - 1) // n )] print(result)
출력해보면 역시나 아래와 같이 잘 나온다.
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k']]
결국 내가 가진 문제도 리스트 컴프리헨션으로 해결하게 되었다.
나도 파이썬 잘하고 싶다.
핑백: [Python] 실시간 환율 정보 크롤링 - 데짱