콘텐츠로 건너뛰기

파이썬으로 리스트를 평탄화하는 방법

CodeMDD.io

Python에서 리스트 평탄화하는 방법

for 루프를 사용하여 리스트의 리스트 평탄화하기

리스트를 평탄화하는 것은 행렬과 같은 다차원 리스트를 일차원 리스트로 변환하는 작업을 의미합니다.

다음과 같은 숫자 값 행렬이 있다고 가정해봅시다:

>>> matrix = [
... [9, 3, 8, 3],
... [4, 5, 2, 8],
... [6, 4, 3, 1],
... [1, 0, 4, 5],
... ]
[9, 3, 8, 3, 4, 5, 2, 8, 6, 4, 3, 1, 1, 0, 4, 5]

어떻게 하면 행렬을 평탄화하여 위와 같은 일차원 리스트를 얻을 수 있을까요? 이 튜토리얼에서는 파이썬에서 그렇게 하는 방법을 배울 것입니다.

for 루프를 사용하여 리스트의 리스트 평탄화하는 방법

파이썬에서 리스트의 리스트를 평탄화하는 방법은 어떤 방법으로든 다음 단계를 명시적으로 또는 암묵적으로 실행할 수 있습니다:

  1. 평탄화된 데이터를 저장할 새로운 빈 리스트를 만듭니다.
  2. 원본 리스트의 각 중첩된 리스트 또는 서브리스트를 반복(iterate)합니다.
  3. 현재 서브리스트에서 각 항목을 평탄화된 데이터 리스트에 추가합니다.
  4. 평탄화된 데이터로 된 결과 리스트를 반환합니다.

matrix 예시를 계속 사용하여 다음의 단계를 파이썬 코드로 변환하는 방법은 다음과 같습니다:

>>> def flatten_extend(matrix):
... flat_list = []
... for row in matrix:
... flat_list.extend(row)
... return flat_list
...

flatten_extend() 함수 내부에서 먼저 flat_list라는 새로운 빈 리스트를 만듭니다. 이 리스트를 사용하여 matrix에서 추출한 평탄화된 데이터를 저장할 것입니다. 그런 다음 matrix의 내부 또는 중첩된 리스트를 반복(iterate)하는 루프를 시작합니다. 이 예제에서는 현재 중첩된 리스트를 나타내기 위해 row라는 이름을 사용합니다.

각 반복에서 .extend()를 사용하여 현재 서브리스트의 내용을 flat_list에 추가합니다. 이 메서드는 인자로 iterables(반복 가능한 개체)를 취하고 해당 개체의 항목을 대상 리스트의 끝에 추가합니다.

이제 다음 코드를 실행하여 함수가 작업을 수행하는지 확인해보세요.

>>> flatten_extend(matrix)
[9, 3, 8, 3, 4, 5, 2, 8, 6, 4, 3, 1, 1, 0, 4, 5]

이 방법은 명시적으로 반복하는 방법을 사용하므로 코드를 이해하기 쉽고 자체적인 로직을 가지고 있습니다. 그러나 다른 방식으로 리스트 평탄화하는 방법도 있습니다. 계속해서 설명하겠습니다.

컴프리헨션을 사용하여 리스트의 리스트 평탄화하기

컴프리헨션은 리스트의 리스트를 평탄화하는 간결한 방법을 제공합니다. 리스트 컴프리헨션을 사용하여 이전의 flatten_extend() 함수를 다음과 같이 변환할 수 있습니다:

>>> def flatten_comprehension(matrix):
... return [item for sublist in matrix for item in sublist]
...

flatten_comprehension() 함수는 단일 줄의 코드로 작성되었습니다. 리스트 컴프리헨션을 사용하여 평탄화된 리스트를 생성합니다. 내부의 for 루프를 사용하여 각 서브리스트의 항목을 평탄화된 리스트에 추가합니다.

>>> flatten_comprehension(matrix)
[9, 3, 8, 3, 4, 5, 2, 8, 6, 4, 3, 1, 1, 0, 4, 5]

앞의 코드에서는 두 개의 for 문이 사용되었으며, 이를 통해 각 서브리스트의 항목을 평탄화된 리스트에 추가하는 작업이 실행됩니다. 리스트 컴프리헨션은 반복문을 사용하는 것보다 간결하고 읽기 쉬운 코드를 작성할 수 있는 좋은 방법입니다.

표준 라이브러리와 내장 도구를 사용하여 리스트 평탄화하기

파이썬의 표준 라이브러리와 내장 도구를 사용하여 리스트의 리스트를 평탄화하는 방법도 있습니다. 다음과 같은 두 가지 방법을 소개하겠습니다.

itertools.chain()을 사용하여 반복 가능한 객체 연결하기

itertools.chain() 함수는 여러 반복 가능한(iterable) 객체를 하나의 반복 가능한 객체로 연결하는 데 사용됩니다. 이 함수를 사용하면 리스트의 리스트를 평탄화할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다:

>>> from itertools import chain
>>>
>>> def flatten_chain(matrix):
... return list(chain(*matrix))
...

flatten_chain() 함수는 itertools.chain() 함수를 사용하여 평탄화된 리스트를 생성합니다. *matrix 구문은 matrix의 요소를 언패킹하여 chain() 함수의 인자로 전달합니다. 이후 list() 함수를 사용하여 평탄화된 데이터를 리스트로 변환합니다.

>>> flatten_chain(matrix)
[9, 3, 8, 3, 4, 5, 2, 8, 6, 4, 3, 1, 1, 0, 4, 5]

itertools.chain() 함수는 코드를 간결하게 유지하는 데 도움이 되며, 여러 반복 가능한 객체를 연결하는 작업을 쉽게 수행할 수 있습니다.

functools.reduce()를 사용하여 리스트를 연결하기

functools.reduce() 함수는 리스트 또는 반복 가능한(iterable) 객체를 반복하고 첫 번째 요소에서부터 마지막 요소까지 함수를 적용하여 하나의 결과를 반환합니다. 리스트를 평탄화하는데 사용할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다:

>>> from functools import reduce
>>>
>>> def concat_lists(list1, list2):
... return list1 + list2
...
>>> def flatten_reduce(matrix):
... return reduce(concat_lists, matrix)
...

flatten_reduce() 함수는 functools.reduce() 함수와 concat_lists() 함수를 사용하여 평탄화된 리스트를 생성합니다. reduce() 함수에 concat_lists() 함수를 적용하여 matrix의 요소를 차례대로 연결합니다.

>>> flatten_reduce(matrix)
[9, 3, 8, 3, 4, 5, 2, 8, 6, 4, 3, 1, 1, 0, 4, 5]

functools.reduce() 함수를 사용하면 연결 작업을 간단하게 수행할 수 있습니다. 그러나 이 함수가 작동하기 위해서는 모든 요소를 메모리에 저장해야하므로 큰 크기의 리스트에는 사용하지 않는 것이 좋습니다.

리스트 평탄화 시 성능 고려하기

리스트를 평탄화할 때 고려해야 할 한 가지 중요한 요소는 성능입니다. 리스트가 크거나 중첩이 많이되어 있을 경우 평탄화하는 동안 메모리 사용량과 실행 시간이 증가할 수 있습니다. 앞에서 소개한 방법 중 어떤 방법을 사용하든지 간에 성능 측면에서 유의해야합니다.

NumPy를 사용하여 데이터 과학용 파이썬 리스트 평탄화하기

리스트 평탄화는 데이터 과학에서 흔히 사용되는 작업입니다. NumPy는 고성능 수치 연산용 파이썬 라이브러리로서 리스트 평탄화 작업에 매우 유용합니다. NumPy를 사용하여 리스트를 평탄화하려면 다음과 같이 코드를 작성할 수 있습니다:

>>> import numpy as np
>>>
>>> def flatten_numpy(matrix):
... return np.array(matrix).flatten().tolist()
...

flatten_numpy() 함수는 np.array()를 사용하여 matrix를 NumPy 배열로 변환한 다음, flatten() 메서드를 사용하여 배열을 평탄화합니다. 이후 tolist() 메서드를 사용하여 정규 파이썬 리스트로 변환합니다.

>>> flatten_numpy(matrix)
[9, 3, 8, 3, 4, 5, 2, 8, 6, 4, 3, 1, 1, 0, 4, 5]

NumPy를 사용하면 리스트를 평탄화하고 다양한 데이터 과학 작업을 수행할 수 있습니다. NumPy의 배열은 많은 수리 및 통계 연산에 유용하며, 다차원 데이터와 작업하는 데 매우 효율적입니다.

결론

본 튜토리얼에서는 파이썬에서 리스트의 리스트를 평탄화하는 다양한 방법을 살펴보았습니다. for 루프, 컴프리헨션, 표준 라이브러리 및 내장 도구, 그리고 NumPy를 사용한 방법 등 다양한 접근 방식을 알아보았습니다. 각 방법의 장단점을 고려하여 필요한 상황에 맞는 방법을 선택할 수 있습니다. 리스트 평탄화는 데이터 처리, 데이터 과학, 알고리즘 등 다양한 영역에서 유용하게 사용될 수 있으며, 파이썬에서 적절한 방법을 선택하여 쉽게 구현할 수 있습니다.