itertools에서 chain과 chain.from_iterable의 차이점은 무엇입니까?
나는 그들 사이의 차이점과 다른 것을 선택하는 이유를 볼 수있는 유효한 예를 인터넷에서 찾을 수 없습니다.
첫 번째는 0 개 이상의 인수를 취하고, 각 인수는 반복 가능하며, 두 번째 인수는 반복 가능을 생성 할 것으로 예상되는 하나의 인수를 취합니다.
from itertools import chain
chain(list1, list2, list3)
iterables = [list1, list2, list3]
chain.from_iterable(iterables)
그러나 iterables
iterable을 생성하는 모든 반복자가 될 수 있습니다.
def gen_iterables():
for i in range(10):
yield range(i)
itertools.chain.from_iterable(gen_iterables())
두 번째 형식을 사용하는 것은 일반적으로 편리한 경우이지만 입력 iterable을 느리게 반복하기 때문에 무한한 수의 유한 반복자 를 연결할 수있는 유일한 방법이기도 합니다.
def gen_iterables():
while True:
for i in range(5, 10):
yield range(i)
chain.from_iterable(gen_iterables())
위의 예제는 절대 멈추지 않지만 단일 range()
호출에 필요한 것보다 더 많은 메모리를 소비하지 않는 순환 패턴을 생성하는 iterable을 제공 합니다.
그들은 매우 유사한 일을합니다. 적은 수의 반복 가능 itertools.chain(*iterables)
하고 itertools.chain.from_iterable(iterables)
유사하게 수행하십시오.
의 주요 장점은 from_iterables
많은 (잠재적으로 무한한) 수의 반복 가능 항목을 처리 할 수 있다는 것입니다. 호출시 모든 항목을 사용할 수있을 필요가 없기 때문입니다.
유효한 예를 찾을 수 없습니다. [
chain
와chain.from_iterable
] 의 차이점 과 다른 하나를 선택해야하는 이유를 볼 수 있습니다.
받아 들여지는 대답은 철저합니다. 빠른 응용 프로그램을 원하는 경우 여러 목록을 병합하는 것이 좋습니다.
list(itertools.chain(["a", "b", "c"], ["d", "e"], ["f"]))
# ['a', 'b', 'c', 'd', 'e', 'f']
나중에이 목록을 재사용 할 수 있으므로 목록을 반복 할 수 있습니다.
iterable = (["a", "b", "c"], ["d", "e"], ["f"])
시도
그러나 iterable을 전달하면 평탄화 chain
되지 않은 결과 가 제공됩니다.
list(itertools.chain(iterable))
# [['a', 'b', 'c'], ['d', 'e'], ['f']]
왜? 하나의 항목 (튜플)을 전달했습니다 . chain
각 목록이 별도로 필요합니다.
솔루션
가능하면 이터 러블의 압축을 풀 수 있습니다.
list(itertools.chain(*iterable))
# ['a', 'b', 'c', 'd', 'e', 'f']
list(itertools.chain(*iter(iterable)))
# ['a', 'b', 'c', 'd', 'e', 'f']
더 일반적으로 사용합니다 .from_iterable
(무한 반복자에서도 작동하므로) :
list(itertools.chain.from_iterable(iterable))
# ['a', 'b', 'c', 'd', 'e', 'f']
g = itertools.chain.from_iterable(itertools.cycle(iterable))
next(g)
# "a"
그것을 보는 또 다른 방법 :
chain(iterable1, iterable2, iterable3, ...)
이터 러블이 무엇인지 이미 알고있는 경우이므로 쉼표로 구분 된 인수로 작성할 수 있습니다.
chain.from_iterable(iterable)
iterables (iterable1, iterable2, iterable3과 같은)가 다른 iterable에서 얻은 경우입니다.
'IT TIP' 카테고리의 다른 글
HTML5 Boilerplate 대 JQuery 및 JQueryUI를 사용한 Twitter 부트 스트랩 (0) | 2020.12.25 |
---|---|
java.util.HashSet에 get (Object o) 메소드가없는 이유는 무엇입니까? (0) | 2020.12.25 |
PHP에서 시간이 두 시간 사이인지 확인하는 방법 (0) | 2020.12.25 |
Python에서 프록시로 Selenium Webdriver 실행 (0) | 2020.12.25 |
관계형 데이터베이스가 Node.js에 적합하지 않습니까? (0) | 2020.12.25 |