2019-10-07

파이썬 리스트 원하는 크기로 자르기

0. 0부터 99까지 총 100개의 숫자를 3개씩 나눠야 할 필요가 있었다.

즉 리스트(l)에서 n개씩 뭉쳐서 다시 리스트로 만들어야 했다.

아래처럼.

[[0, 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, 31, 32], [33, 34, 35], [36, 37, 38], [39, 40, 41], [42, 43, 44], [45, 46, 47], [48, 49, 50], [51, 52, 53], [54, 55, 56], [57, 58, 59], [60, 61, 62], [63, 64, 65], [66, 67, 68], [69, 70, 71], [72, 73, 74], [75, 76, 77], [78, 79, 80], [81, 82, 83], [84, 85, 86], [87, 88, 89], [90, 91, 92], [93, 94, 95], [96, 97, 98], [99]]



1. 해법은 간단했다.

딱 한 줄이면 끝난다.

[l[i:i + n] for i in range(0, len(l), n)]

어떻게 이런 코드가 나왔는지 살펴본다.

l = [i for i in range(100)]
n = 3
for i in (range(0, len(l), n)):
    print(i)

print([l[i:i + n] for i in range(0, len(l), n)])



2. 해설

[i for i in range(100)]

위의 코드는 리스트를 생성할 때 사용할 수 있는 '표현식(list comprehension)'이다.

원리에 관한 내용은 공개 강의인 코딩 도장에서 확인할 수 있다.

그렇게 0부터 99까지 총 100개의 정수가 담긴 리스트가 l이라는 변수에 바인딩 되어있다.
(실제로는 0부터 차례대로 생성해내는 제너레이터를 쓰지만 여기에선 편의상 이렇게 부르기로)

찬찬히 표현식의 뒷쪽부터 살펴보자.

range(0, len(l), n)

range() 함수를 이용해서 0부터 l의 개수만큼의 리스트를 만드는데

세 번째 아규먼트는 step 수를 나타낸다.

세 번째 값이 생략되어 있으면 0, 1, 2, 3, 4, 5...를 만들겠지만

세 번째 값이 만약에 3이라면, 0, 3, 6, 9, 12, 15...를 만들게 된다.

해당 값에 대한 앞의 표현식은

l[i:i + n]

이다.

즉, 리스트인 l에서 i번째부터 i + n번째 엘리먼트까지 슬라이싱하게 되므로

0:3, 3:6, 6:9, 9:12, 12:15... 와 같은 방식으로 슬라이싱이 이루어진다는 뜻이다.

파이썬은 끝 번호를 넣지 않으므로 [0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]... 처럼

깔끔하게 3개씩 슬라이싱이 가능해진다.

실로 간결하고 아름다운 표현식이 아닐 수 없다.


댓글 없음:

댓글 쓰기