Python에서 목록 목록을 평면화하는 방법

Python에서 목록 목록을 평면화하는 방법을 알아보세요. 중첩된 목록 이해, itertools.chain, sum 및 재귀 메서드를 코드 예제와 비교해 보세요.

Editor에서 이 솔루션을 사용해 보세요.

개요

행렬 계산, 데이터베이스 행 또는 구문 분석된 데이터 트리로 작업할 때 목록 목록 `[[1, 2], [3, 4]]`와 같은 중첩 구조를 자주 접하게 됩니다. 이 구조를 평면화한다는 것은 모든 개별 요소(`[1, 2, 3, 4]`)를 포함하는 1차원 목록으로 변환하는 것을 의미합니다. Python은 이를 달성하기 위한 몇 가지 우아한 방법을 제공합니다.

목록 목록을 평면화하는 가장 일반적이고 파이썬적인 방법은 중첩된 목록 이해를 사용하는 것입니다: `[하위 목록의 항목에 대한 행렬의 하위 목록에 대한 항목]`. 루프가 중첩된 `for` 루프와 동일한 순서로 작성되기 때문에 처음에는 구문이 약간 반직관적으로 보일 수 있지만 고도로 최적화되고 빠르며 외부 라이브러리를 가져올 필요가 없습니다.

또는 `itertools` 모듈의 `chain.from_iterable()` 함수를 사용할 수 있습니다. 이는 메모리에 새 목록을 즉시 할당하는 대신 요소를 느리게 생성하는 반복자를 반환하기 때문에 가장 메모리 효율적인 접근 방식입니다. 깊게 중첩된 목록(임의의 깊이 포함)의 경우 모든 수준의 압축을 풀기 위해 재귀 생성기 함수를 작성해야 합니다.

코드 및 실행 출력

이 스크립트는 목록 이해, itertools.chain 및 재귀적 압축 풀기를 사용하여 목록 목록을 평면화하는 방법을 보여줍니다.

import itertools

matrix = [[1, 2, 3], [4, 5], [6, 7, 8]]

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
터미널 출력
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

단계별 구현

  • 플랫 2D 구조에는 중첩 목록 이해 [하위 목록의 항목에 대한nested_list의 하위 목록에 대한 항목]를 사용합니다.
  • 지연되고 메모리 친화적인 평가를 위해 itertools를 가져오고 itertools.chain.from_iterable(nested_list)를 호출하세요.
  • 임의로 중첩된 컬렉션을 처리하기 위해 isinstance(item, list)를 검사하는 재귀 함수를 정의합니다.

자주 묻는 질문

sum() 함수를 사용하여 목록을 평면화할 수 있나요?

예, sum(matrix, []) 는 작동하지만 매우 권장되지 않습니다. 추가할 때마다 새 목록 복사본을 생성하므로 O(N^2) 복잡성으로 실행되어 대규모 데이터 세트의 성능이 저하됩니다.

목록 목록을 평면화하는 가장 빠른 방법은 무엇입니까?

itertools.chain.from_iterable()은 일반적으로 가장 빠르며 중첩된 목록 이해가 그 뒤를 따릅니다.

관련 주제

권장 Python 리소스

관련 대화형 튜토리얼, 치트 시트, 코드 비교를 통해 지식을 확장하세요.