본문 바로가기
Python/Python FAQ

Python 리스트의 불규칙한 (임의로 중첩된) 리스트를 평평하게 만듭니다., Flatten an irregular (arbitrarily nested) list of lists

by 베타코드 2023. 10. 6.
반응형

질문


네, 저는 이 주제가 이전에 다뤄졌다는 것을 알고 있습니다:

하지만 내가 알기로는, 하나를 제외한 모든 해결책들은 [[[1, 2, 3], [4, 5]], 6]와 같은 리스트에서 실패합니다. 여기서 원하는 출력은 [1, 2, 3, 4, 5, 6]입니다 (아니면 더 좋게는 반복자).

내가 본 유일한 해결책은 임의의 중첩에 대해 작동하는 것으로 보입니다. 이 질문에서 찾을 수 있습니다:

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

이게 최선의 방법인가요? 놓친 것이 있을까요? 어떤 문제가 있을까요?


답변


generator 함수를 사용하면 예제를 읽기 쉽게 만들고 성능을 향상시킬 수 있습니다.

Python 2

2.6에 추가된 Iterable ABC를 사용합니다:

from collections import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, basestring):
            for item in flatten(x):
                yield item
        else:
            yield x

Python 3

Python 3에서는 basestring이 없어졌지만 튜플 (str, bytes)는 동일한 효과를 제공합니다. 또한, yield from 연산자는 한 번에 한 개의 항목을 생성자로부터 반환합니다.

from collections.abc import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            yield from flatten(x)
        else:
            yield x
반응형

댓글