IT TIP

itertools에서 chain과 chain.from_iterable의 차이점은 무엇입니까?

itqueen 2020. 12. 25. 10:40
반응형

itertools에서 chain과 chain.from_iterable의 차이점은 무엇입니까?


나는 그들 사이의 차이점과 다른 것을 선택하는 이유를 볼 수있는 유효한 예를 인터넷에서 찾을 수 없습니다.


첫 번째는 0 개 이상의 인수를 취하고, 각 인수는 반복 가능하며, 두 번째 인수는 반복 가능을 생성 할 것으로 예상되는 하나의 인수를 취합니다.

from itertools import chain

chain(list1, list2, list3)

iterables = [list1, list2, list3]
chain.from_iterable(iterables)

그러나 iterablesiterable을 생성하는 모든 반복자가 될 수 있습니다.

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많은 (잠재적으로 무한한) 수의 반복 가능 항목을 처리 할 수 ​​있다는 것입니다. 호출시 모든 항목을 사용할 수있을 필요가 없기 때문입니다.


유효한 예를 찾을 수 없습니다. [ chainchain.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에서 얻은 경우입니다.

참조 URL : https://stackoverflow.com/questions/15004772/what-is-the-difference-between-chain-and-chain-from-iterable-in-itertools

반응형