Python은 다양한 데이터 타입을 다루기 때문에, 때때로 리스트가 문자열(string) 형태로 저장되어 있는 경우를 마주하게 됩니다. 예를 들어 파일이나 API 응답에서 데이터를 받을 때 리스트가 문자열처럼 보이는 상황이 발생할 수 있죠. 이 글에서는 이러한 문자열을 실제 리스트 객체로 변환하는 대표적인 세 가지 방법을 살펴보겠습니다.
1. strip()과 split() 조합하기
가장 직관적인 방법입니다. 먼저 strip() 메서드로 문자열 양 끝의 대괄호([, ])를 제거한 뒤, split() 함수에 쉼표를 구분자로 전달하여 리스트를 생성합니다.
예제
stringA = "[Mon, 2, Tue, 5]"
# 주어진 문자열
print("Given string", stringA)
print(type(stringA))
# 문자열을 리스트로 변환
res = stringA.strip('][').split(', ')
# 결과와 타입 확인
print("final list", res)
print(type(res))실행 결과
Given string [Mon, 2, Tue, 5] final list ['Mon', '2', 'Tue', '5,'] <class 'list'>
주의할 점은 이 방식으로 변환하면 모든 요소가 문자열 타입으로 유지된다는 것입니다. 숫자도 문자열 '2', '5,'로 처리되므로, 필요하다면 추가로 타입 변환 작업이 필요합니다.
2. json.loads() 활용하기
json 모듈의 loads() 함수를 사용하면 문자열을 리스트로 직접 변환할 수 있습니다. 문자열을 매개변수로 전달하기만 하면 되며, 이 방식의 장점은 숫자 요소가 정수(int) 타입으로 변환된다는 점입니다.
예제
import json
stringA = "[21,42, 15]"
# 주어진 문자열
print("Given string", stringA)
print(type(stringA))
# 문자열을 리스트로 변환
res = json.loads(stringA)
# 결과와 타입 확인
print("final list", res)
print(type(res))실행 결과
Given string [21,42, 15] final list [21, 42, 15] <class 'list'>
단, json.loads()는 유효한 JSON 형식의 문자열만 처리할 수 있습니다. 즉, 요소는 반드시 큰따옴표로 감싸진 문자열이거나 숫자여야 하며, 작은따옴표나 후행 쉼표가 있으면 오류가 발생합니다.
3. ast.literal_eval() 활용하기
ast 모듈의 literal_eval() 함수는 Python 리터럴 표현식으로 작성된 문자열을 안전하게 평가하여 리스트로 변환해 줍니다. 문자열을 매개변수로 넘겨주기만 하면 됩니다.
예제
import ast
stringA = "[21,42, 15]"
# 주어진 문자열
print("Given string", stringA)
print(type(stringA))
# 문자열을 리스트로 변환
res = ast.literal_eval(stringA)
# 결과와 타입 확인
print("final list", res)
print(type(res))실행 결과
Given string [21,42, 15] final list [21, 42, 15] <class 'list'>
ast.literal_eval()은 json.loads()와 달리 작은따옴표로 감싸진 문자열 요소도 처리할 수 있어 Python 스타일의 리스트 문자열에 더 유연하게 대응합니다. 다만 임의의 Python 코드를 실행하지 않고 리터럴 값만 평가한다는 점에서 안전성이 보장되므로, 신뢰할 수 없는 입력에는 eval() 대신 이 함수를 사용하는 것이 좋습니다.
정리
세 가지 방법을 비교하면 다음과 같습니다.
- strip() + split(): 간단하지만 모든 요소가 문자열로 유지되며, 불완전한 형식(후행 쉼표 등)도 어느 정도 처리 가능
- json.loads(): 숫자 타입 변환이 자동으로 이루어지지만, 엄격한 JSON 형식을 요구
- ast.literal_eval(): Python 리터럴 문법을 그대로 지원하며 안전하고 유연함
상황과 데이터 형식에 맞는 적절한 방법을 선택하여 사용하시기 바랍니다.