>백엔드 개발 >파이썬 튜토리얼 >Python 생성기는 어떻게 임의로 중첩된 목록을 효율적으로 평면화할 수 있습니까?

Python 생성기는 어떻게 임의로 중첩된 목록을 효율적으로 평면화할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-21 15:02:09693검색

How Can Python Generators Efficiently Flatten Arbitrarily Nested Lists?

Python 생성기를 사용하여 불규칙 목록 평면화

임의로 중첩된 목록 목록을 평면화하는 문제는 흔히 발생하지만 기존 솔루션은 심각한 실패를 겪는 경우가 많습니다. 중첩된 구조. 특히 [[[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

그러나 이 기능이 작동하는 동안 생성기를 사용하면 가독성과 성능 측면에서 향상될 수 있습니다.

반복 가능한 ABC가 포함된 Python 2

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

반복 가능한 ABC 및 Yield From이 포함된 Python 3

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

이 발전기 기반 솔루션은 보다 간결하고 효율적인 방법을 제공합니다. 불규칙한 목록을 병합합니다. 목록의 각 요소를 반복하고 하위 목록의 요소를 반복적으로 생성하는 방식으로 작동합니다. 반복할 수 없는 요소(예: 숫자 또는 문자열)는 즉시 생성됩니다.

위 내용은 Python 생성기는 어떻게 임의로 중첩된 목록을 효율적으로 평면화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.