Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python)에서 문자열 리스트를 중첩 리스트(리스트의 리스트)로 변환하는 방법

파이썬 프로그래밍을 하다 보면 문자열 형태의 리스트 요소들을 실제 리스트의 리스트, 즉 중첩 리스트(nested list) 구조로 변환해야 하는 경우가 자주 발생합니다. 예를 들어 파일에서 읽어온 데이터나 외부 API로부터 받은 문자열이 '[0, 1, 2, 3]'처럼 리스트 모양을 하고 있을 때, 이를 실제 리스트 객체로 다루고 싶다면 적절한 변환 과정이 필요합니다.

이 글에서는 문자열 데이터 타입으로 이루어진 리스트를 각 요소가 개별 문자열로 분리된 중첩 리스트로 변환하는 대표적인 두 가지 방법을 소개합니다. 내부 리스트는 숫자나 문자열 등 다양한 타입의 요소를 포함할 수 있습니다.

방법 1: strip()과 split() 함수 활용

가장 직관적인 방법은 strip()split() 두 메서드를 조합하는 것입니다. 먼저 strip("[]")으로 문자열 양 끝의 대괄호를 제거하고, 이후 split(", ")을 통해 쉼표를 기준으로 각 요소를 분리하여 새로운 리스트를 만듭니다.

예제 코드

list1 = [ '[0, 1, 2, 3]','["Mon", "Tue", "Wed", "Thu"]' ]
print ("주어진 리스트 : \n" + str(list1))
print("\n")
# strip() + split() 활용
result = [k.strip("[]").split(", ") for k in list1]
print ("문자열 리스트를 중첩 리스트로 변환 : \n" + str(result))

실행 결과

위 코드를 실행하면 아래와 같은 결과가 출력됩니다.

주어진 리스트 :
['[0, 1, 2, 3]', '["Mon", "Tue", "Wed", "Thu"]']
문자열 리스트를 중첩 리스트로 변환 :
[['0', '1', '2', '3'], ['"Mon"', '"Tue"', '"Wed"', '"Thu"']]

결과를 보면 각 문자열이 대괄호 없이 개별 요소로 분리되어 2차원 리스트 구조로 성공적으로 변환된 것을 확인할 수 있습니다.

방법 2: 슬라이싱(Slicing)과 split() 함수 활용

두 번째 방법은 문자열 슬라이싱을 이용하는 것입니다. i[1:-1]처럼 인덱스 범위를 지정하면 문자열의 첫 번째와 마지막 문자, 즉 여는 대괄호 '['와 닫는 대괄호 ']'를 제외한 나머지 부분만 추출할 수 있습니다. 이후 for 루프와 함께 split() 함수를 적용해 각 요소를 분리합니다.

예제 코드

list1 = [ '[0, 1, 2, 3]','["Mon", "Tue", "Wed", "Thu"]' ]
print ("주어진 리스트 : \n" + str(list1))
print("\n")
# split() 활용
result = [i[1 : -1].split(', ') for i in list1]
print ("문자열 리스트를 중첩 리스트로 변환 : \n" + str(result))

실행 결과

위 코드를 실행하면 동일하게 아래 결과를 얻을 수 있습니다.

주어진 리스트 :
['[0, 1, 2, 3]', '["Mon", "Tue", "Wed", "Thu"]']
문자열 리스트를 중첩 리스트로 변환 :
[['0', '1', '2', '3'], ['"Mon"', '"Tue"', '"Wed"', '"Thu"']]

마무리 및 추가 팁

정리하면, strip() + split() 조합은 코드의 의도가 명확해서 가독성이 좋고, 슬라이싱 + split() 방식은 불필요한 문자 검색 과정을 생략하기 때문에 상황에 따라 더 효율적일 수 있습니다.

참고로, 문자열 안의 내용이 유효한 파이썬 문법이라면 ast.literal_eval()을 사용하는 방법도 고려해볼 수 있습니다. 이 방식은 숫자를 정수형(int)으로 자동 변환해 주기 때문에 타입까지 유지하고 싶을 때 유용합니다.

import ast

list1 = [ '[0, 1, 2, 3]','["Mon", "Tue", "Wed", "Thu"]' ]
result = [ast.literal_eval(k) for k in list1]
print(result)
# 출력: [[0, 1, 2, 3], ['Mon', 'Tue', 'Wed', 'Thu']]

다만 ast.literal_eval()은 외부 입력값에 대해 예외 처리를 함께 해주는 것이 안전하므로, 단순한 문자열 분리 작업이라면 앞서 소개한 split 기반 방법을 우선적으로 사용하는 것을 권장합니다.