파이썬 리스트를 동일한 크기로 분할하기

최근에 파이썬으로 코드를 짜다가 긴 리스트를 동일한 크기로 나누는 방법이 생각이 안나서 당황했다. 이 기회에 코드를 정리해본다.

나의 목표는 아래와 같은 리스트를

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']]

결국 내가 가진 문제도 리스트 컴프리헨션으로 해결하게 되었다.

나도 파이썬 잘하고 싶다.

지금 인기 글


“파이썬 리스트를 동일한 크기로 분할하기”의 1개의 댓글

  1. 핑백: [Python] 실시간 환율 정보 크롤링 - 데짱

댓글 남기기