[Python] itertools를 활용한 리스트 원소를 n번 반복하여 새로운 리스트 만들기
Python 분석과 프로그래밍/Python 데이터 전처리 2019. 7. 21. 23:29이번 포스팅에서는 빠르고 메모리를 효율적으로 사용해서 반복자((fast and memory-efficient iterator)를 만들어주는 itertools 모듈을 사용해서 리스트 원소를 n번 반복하고 묶어서 새로운 리스트를 만드는 4가지 유형의 방법을 소개하겠습니다.
먼저 itertools 모듈에서 chain(), repeat() 함수를 불러오고, 예제로 사용할 반복할 리스트(numbers)와 반복할 회수(n)을 만들어놓겠습니다.
In [1]: from itertools import chain, repeat In [2]: numbers = [1, 2, 3] In [3]: n = 3 |
(1) itertools.repeat(object, times) : object를 times 만큼 반복하기 |
itertools의 repeat() 함수로 [1, 2, 3] 리스트를 3번 반복하면, 아래처럼 리스트 안에 [1, 2, 3] 리스트가 각 각 분리([1, 2, 3], [1, 2, 3], [1, 2, 3])되어서 들어가 있습니다.
In [4]: list(repeat(numbers, n)) Out[4]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]] |
(2) itertools.chain.from_iterable(repeat(object, times))) |
위의 (1)번과는 다르게, [1, 2, 3, 1, 2, 3, 1, 2, 3] 의 단 하나의 리스트로 묶였습니다.
In [5]: list(chain.from_iterable(repeat(numbers, n)))
Out[5]: [1, 2, 3, 1, 2, 3, 1, 2, 3]
|
(3) itertools.chain.from_iterable((repeat(object, times) for object in objects))) |
list comprehension 으로 for loop을 이용하여서 numbers 리스트 안의 각 원소인 1, 2, 3 별로 3번씩 반복한 후, 이를 하나의 리스트로 묶어준 경우입니다.
In [6]: list(chain.from_iterable((repeat(number, n) for number in numbers)))
Out[6]: [1, 1, 1, 2, 2, 2, 3, 3, 3]
|
(4) itertools.chain.from_iterable((repeat(object, time) |
반복할 수 times 인자를 반복할 대상 objects 내 원소별로 다르게 하고 싶을 때가 있습니다. 이럴 때는 zip() 으로 반복할 대상 object와 반복할 회수 time을 짝으로 묶어서 반복을 시켜주면 됩니다.
In [7]: numbers = [1, 2, 3]
...: n_list = [3, 5, 7] In [8]: list(chain.from_iterable((repeat(number, n) for (number, n) in zip(numbers, n_list)))) Out[8]: [1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3] |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. :-)