HOWTO · Python
파이썬에서 두 개 또는 여러 개의 목록을 연결하는 방법
이 튜토리얼에서는 파이썬에서 두 개 이상의 목록을 결합하는 여러 방법을 살펴보고, 새 목록을 만들지 기존 목록을 수정할지, 결과가 목록인지 이터레이터인지에 따라 적절한 방법을 선택하는 법을 설명합니다.
이 페이지의 내용
새 목록이 필요하면 +를 사용하고, 기존 목록에 항목을 추가하려면 extend() 또는 +=를 사용하세요. 여러 목록을 결합할 때는 이터러블 언패킹이 간결하며, 값을 이터레이터로 처리하려면 itertools.chain()을 사용할 수 있습니다. 아래 예제는 같은 목록을 사용하므로 각 결과를 살펴볼 수 있습니다.
파이썬 목록은 순서가 있는 항목을 담으며 여러 방법으로 결합할 수 있습니다. 원본 목록을 변경할지, 다음 단계에서 목록과 이터레이터 중 무엇이 필요한지에 따라 방법을 선택하세요.
+ 연산자로 목록 연결하기
+ 연산자는 새 목록을 만들고 두 입력 목록은 변경하지 않습니다. 두 개 이상의 목록에 사용할 수 있으며, +를 추가할 때마다 다른 목록을 이어 붙입니다.
first = [1, 2, 3]
second = [4, 5]
third = [6, 7]
combined = first + second + third
print(combined)
예를 들어 first = first + second를 대입하면 first는 새로 결합된 목록을 가리킵니다. 기존 목록 객체를 제자리에서 확장하는 것은 아닙니다. 원본 목록을 그대로 사용할 필요가 있다면 +를 선택하세요.
extend()로 목록 확장하기
extend()는 이터러블의 각 항목을 호출한 목록의 끝에 추가합니다. 해당 목록을 변경하고 None을 반환하므로, 메서드 호출 결과를 변수에 대입하지 말고 대상 목록을 변수에 보관하세요.
first = [1, 2, 3]
second = [4, 5]
first.extend(second)
이는 first.append(second)와 다릅니다. append()는 second를 중첩된 항목 하나로 추가하지만, extend()는 그 안의 항목을 하나씩 추가합니다. 이터러블로는 목록, 튜플 또는 다른 이터러블을 사용할 수 있습니다.
+=로 목록을 제자리에서 확장하기
목록에 +=를 사용하면 extend()와 비슷하게 오른쪽 이터러블의 항목을 기존 목록에 추가합니다.
first = [1, 2, 3]
second = [4, 5]
first += second
왼쪽 목록을 갱신하려는 경우 간결하게 쓸 수 있습니다. 반면 first = first + second는 새 목록을 만들고 이름 first가 그 목록을 가리키게 합니다.
언패킹으로 목록 연결하기
이터러블 언패킹을 사용하면 각 원본 목록의 항목이 새 목록 리터럴에 들어갑니다. 두 개 이상의 목록에 사용할 수 있으며 입력 목록은 변경하지 않습니다.
first = [1, 2, 3]
second = [4, 5]
third = [6, 7]
combined = [*first, *second, *third]
대괄호 안에서 *는 각 이터러블의 항목을 펼쳐 하나의 평탄한 목록을 만듭니다. 이 언패킹 문법은 Python 3.5에서 도입되었습니다(PEP 448 참조).
itertools.chain() 사용하기
itertools.chain()은 입력 이터러블의 항목을 순서대로 내보냅니다. 이터레이터를 반환하므로 실제 목록이 필요하면 list()로 감싸세요.
from itertools import chain
first = [1, 2, 3]
second = [4, 5]
third = [6, 7]
combined = list(chain(first, second, third))
값을 반복해서 처리하기만 하면 이터레이터를 그대로 사용하여 결합된 목록을 미리 만들지 않을 수 있습니다. itertools.chain()에 관한 파이썬 문서를 참조하세요.
반복문이나 리스트 컴프리헨션으로 목록 연결하기
각 항목을 추가로 처리해야 할 때는 반복문이 유용합니다. append()는 한 번에 항목 하나를 추가하므로, 평탄한 결과를 만들려면 각 원본 목록의 항목을 순회하세요.
lists = [[1, 2, 3], [4, 5], [6, 7]]
combined = []
for current in lists:
for item in current:
combined.append(item)
리스트 컴프리헨션을 사용하면 같은 순회를 간결하게 표현할 수 있습니다.
lists = [[1, 2, 3], [4, 5], [6, 7]]
combined = [item for current in lists for item in current]
두 방법 모두 새 목록을 만듭니다. 단계 설명이나 추가 로직이 필요하면 반복문을 사용하고, 단순히 평탄화하는 표현에는 컴프리헨션을 사용하세요.
방법 비교 및 선택하기
| 방법 | 입력을 변경하나요? | 결과 | 여러 목록에 사용할 수 있나요? |
|---|---|---|---|
+ |
아니요 | 새 목록 | 예 |
extend() |
예, 대상 목록 | 호출 결과는 None |
원본 목록마다 한 번씩 호출 |
+= |
예, 왼쪽 목록 | 왼쪽 목록을 제자리에서 변경 | 원본 목록마다 적용 |
| 언패킹 | 아니요 | 새 목록 | 예 |
itertools.chain() |
아니요 | 이터레이터 | 예 |
| 반복문 또는 컴프리헨션 | 아니요 | 새 목록 | 예 |
읽기 쉬운 새 목록이 필요하면 + 또는 언패킹을 사용하고, 기존 목록을 확장하려면 extend() 또는 +=를 사용하세요. 다음 작업에 이터레이터가 적합하다면 itertools.chain()을 선택하세요. 이후 코드에서 인덱싱이나 목록 메서드가 필요하면 list()로 변환하면 됩니다. 각 방법은 메모리 할당과 변경 방식이 다르지만, 모든 입력 크기와 작업 부하에 적용되는 단일 성능 순위는 없습니다. 실행 시간이나 메모리가 중요한 기준이라면 대표적인 데이터로 측정하세요.
결론
두 개 이상의 파이썬 목록에서 새 목록을 만들려면 + 또는 언패킹을 사용하고, 대상 목록을 수정하려면 extend() 또는 +=를 사용하세요. 항목을 지연 방식으로 순회하려면 itertools.chain()을 사용하면 됩니다. 주변 코드에 더 잘 맞는다면 반복문이나 컴프리헨션으로 평탄한 새 목록을 만들 수도 있습니다.