콘텐츠로 건너뛰기

파이썬 리스트 펼치기 (Python Flatten List)

CodeMDD.io

Python으로 리스트의 리스트 펼치기

리스트의 리스트 펼치는 방법

데이터 작업을 할 때 종종 리스트의 리스트 형태로 데이터를 다루게 됩니다. 이 경우 Python에서는 이러한 데이터를 펼치는(flatten) 작업을 수행해야합니다. 리스트를 펼치는 것은 행렬과 같은 다차원 리스트를 일차원 리스트로 변환하는 것을 의미합니다.

리스트를 펼치는 방법을 더 잘 이해하기 위해 다음과 같은 숫자 값 행렬이 있다고 가정해보겠습니다:

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]

위의 예시와 같이 행렬의 데이터를 펼치는 방법은 무엇일까요? 이 튜토리얼에서는 Python에서 이를 어떻게 수행할 수 있는지 알아보겠습니다.

for 루프를 사용하여 리스트의 리스트 펼치는 방법

Python에서 리스트의 리스트를 어떻게 펼칠 수 있을까요? 일반적으로 리스트의 리스트를 펼치려면 다음 절차를 명시적으로 또는 암묵적으로 실행할 수 있습니다:

  1. 펼친 데이터를 저장할 새로운 빈 리스트를 생성합니다.
  2. 원본 리스트에서 각 중첩 리스트 또는 하위 리스트를 반복합니다.
  3. 각 하위 리스트의 항목을 펼친 데이터 리스트에 추가합니다.
  4. 펼친 데이터를 포함한 결과 리스트를 반환합니다.

matrix 예시를 계속 사용하여 for 루프와 .extend() 메서드를 사용하여 이러한 단계를 Python 코드로 변환하는 방법을 살펴보겠습니다:

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

flatten_extend() 내부에서 flat_list라는 빈 리스트를 먼저 만듭니다. 펼친 데이터를 추출하여 matrix에서 가져올 때 이 리스트를 사용합니다. 그런 다음 matrix의 내부 또는 중첩된 리스트를 반복하는 루프를 시작합니다. 이 예시에서는 현재 중첩된 리스트를 나타내기 위해 row라는 이름을 사용합니다.

이제 다음 코드를 실행하여 함수가 작동하는지 확인할 수 있습니다:

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

위의 예제 코드를 실행하면 목표한대로 행렬이 펼쳐진 결과가 출력됩니다.

for 루프를 사용하지 않고 리스트의 리스트 펼치는 방법

for 루프를 사용하는 대신 Python의 기본 함수와 라이브러리를 활용하여 리스트의 리스트를 펼칠 수도 있습니다. 다음과 같은 방법을 살펴보겠습니다.

itertools.chain()을 사용하여 이터러블 연결하기

itertools 모듈은 다양한 유용한 함수와 도구를 제공합니다. 리스트를 이어붙이는 데 사용할 수있는 itertools.chain() 함수를 사용하여 리스트의 리스트를 펼칠 수 있습니다.

아래의 예제는 itertools.chain()을 사용하여 matrix를 펼치는 방법을 보여줍니다:

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

itertools.chain()은 여러 개의 이터러블을 인수로 받아서 이들의 아이템을 하나로 이어 붙이는 이터레이터를 반환합니다. 리스트의 리스트를 인수로 전달할 때는 * 연산자를 사용하여 중첩 리스트를 언패킹해야합니다. 이어붙인 결과를 리스트로 변환하기 위해 list() 함수를 사용할 수 있습니다.

위의 예제 코드를 실행하여 펼친 리스트를 얻을 수 있습니다:

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

flatten_chain(matrix)의 결과는 원하는대로 행렬이 펼쳐진 결과입니다.

functools.reduce()를 사용하여 리스트 이어붙이기

Python의 functools.reduce() 함수도 이용할 수 있습니다. 이 함수를 사용하면 반복 가능한 객체의 모든 항목을 하나의 값으로 결합할 수 있습니다. 리스트의 리스트를 이어붙이는 데 사용할 수 있는 functools.reduce()를 사용하면 다음과 같이 리스트를 펼칠 수 있습니다:

import functools
def flatten_reduce(matrix):
return functools.reduce(lambda x, y: x + y, matrix)

functools.reduce() 함수는 첫 번째 인수로 함수와 변환할 수 있는 요소를 받습니다. 여기서는 두 개의 인수와 연산자 +를 사용하여 리스트를 이어붙입니다. 이렇게 하면 각 하위 리스트를 순서대로 이어 붙일 수 있습니다.

위의 예제 코드를 실행하여 펼친 리스트를 얻을 수 있습니다:

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

결과는 원하는대로 행렬이 펼쳐진 리스트입니다.

sum()을 사용하여 리스트 이어붙이기

sum() 함수를 사용하여 리스트를 이어 붙일 수도 있습니다. 이 함수의 두 번째 인수로 줄 수 있도록 시작값을 지정하는 기능을 사용할 수 있습니다. 리스트의 리스트를 펼치기 위해 sum() 함수를 사용하는 방법은 다음과 같습니다:

def flatten_sum(matrix):
return sum(matrix, [])

위의 예제 코드를 실행하여 펼친 리스트를 얻을 수 있습니다:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = flatten_sum(matrix)
print(result)

위의 코드를 실행하면 숫자 값 행렬이 펼쳐진 결과가 출력됩니다.

리스트 펼칠 때 성능 고려하기

리스트를 펼칠 때 성능도 중요한 고려 사항입니다. for 루프를 사용하는 방법은 작은 크기의 리스트에서 잘 동작하지만 큰 데이터셋에서는 성능 문제가 발생할 수 있습니다. 따라서 대규모 데이터셋과 작업하거나 리스트 펼칠 때 높은 성능을 요구하는 경우에는 다른 방법을 고려해야 할 수 있습니다.

예를 들어, 데이터 과학 작업을 할 때는 NumPy 라이브러리를 사용하여 리스트를 효율적으로 펼칠 수 있습니다. NumPy는 고성능 수학 연산을 위해 설계된 라이브러리이며, 다차원 배열을 효율적으로 처리할 수 있습니다.

NumPy를 사용하여 리스트의 리스트를 펼치는 방법은 다음과 같습니다:

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

numpy.array() 함수를 사용하여 matrix를 NumPy 배열로 변환한 다음 .flatten() 메서드를 사용하여 배열을 일차원으로 펼칩니다. 마지막으로 .tolist()를 호출하여 NumPy 배열을 다시 일반 Python 리스트로 변환합니다.

위의 예제 코드를 실행하여 펼친 리스트를 얻을 수 있습니다:

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

결과는 원하는대로 행렬이 펼쳐진 리스트입니다.

결론

Python에서 리스트의 리스트를 펼치는 방법은 여러 가지가 있습니다. for 루프를 사용하여 고전적인 방식으로 펼칠 수도 있고, 다양한 내장 함수와 도구를 사용하여 펼칠 수도 있습니다. 리스트 펼칠 때 성능을 고려해야하는 상황에서는 NumPy와 같은 전문 라이브러리를 사용하는 것도 좋은 선택일 수 있습니다. 각 방법에 대해 이해하고 문제의 상황에 맞춰 적절한 방법을 선택하세요.