데이터를 다루다 보면 문자열로 전달되지만 그 내부 구조는 파이썬 리스트와 동일한 경우가 종종 있습니다. 예를 들어 파일이나 API 응답에서 받은 데이터가 "['Mon', 2, 'Tue', 4]"처럼 리스트 모양의 문자열일 수 있는데, 이대로는 인덱싱이나 반복문 등 리스트 연산을 사용할 수 없습니다. 이 글에서는 문자열로 묶인 리스트를 실제 파이썬 리스트 객체로 변환하는 대표적인 세 가지 방법을 소개합니다.
1. eval() 함수 사용하기
eval() 함수는 문자열로 전달된 파이썬 표현식을 그대로 평가하여 실제 결과를 반환합니다. 따라서 리스트 형태의 문자열을 eval()에 넘기면 곧바로 파이썬 리스트를 얻을 수 있습니다.
예제 코드
stringA = "['Mon', 2,'Tue', 4, 'Wed',3]"
# 입력 문자열 확인
print("Given string : \n", stringA)
print(type(stringA))
# eval을 사용한 변환
res = eval(stringA)
# 변환 결과 및 타입 확인
print("The converted list : \n", res)
print(type(res))
실행 결과
Given string : ['Mon', 2,'Tue', 4, 'Wed',3] <class 'str'> The converted list : ['Mon', 2, 'Tue', 4, 'Wed', 3] <class 'list'>
문자열(str) 타입이었던 값이 리스트(list) 타입으로 성공적으로 변환되었습니다.
eval()은 전달된 코드를 그대로 실행하므로, 신뢰할 수 없는 외부 입력에 사용하면 심각한 보안 취약점이 발생할 수 있습니다. 외부 데이터에는 아래의 ast.literal_eval() 사용을 권장합니다.
2. ast.literal_eval() 함수 사용하기
ast 모듈의 literal_eval() 함수는 문자열을 안전하게 평가해 줍니다. 내부적으로 파이썬 리터럴(리스트, 딕셔너리, 숫자, 문자열 등)만 허용하고 임의의 코드 실행은 차단하기 때문에, eval()보다 훨씬 안전한 대안입니다.
예제 코드
import ast
stringA = "['Mon', 2,'Tue', 4, 'Wed',3]"
# 입력 문자열 확인
print("Given string : \n", stringA)
print(type(stringA))
# literal_eval을 사용한 변환
res = ast.literal_eval(stringA)
# 변환 결과 및 타입 확인
print("The converted list : \n", res)
print(type(res))
실행 결과
Given string : ['Mon', 2,'Tue', 4, 'Wed',3] <class 'str'> The converted list : ['Mon', 2, 'Tue', 4, 'Wed', 3] <class 'list'>
eval()과 동일한 결과를 얻으면서도 코드 실행 위험 없이 안전하게 변환할 수 있습니다.
3. json.loads() 함수 사용하기
json 모듈의 loads() 함수는 JSON 형식의 문자열을 파이썬 객체로 역직렬화(deserialize)합니다. 리스트 형태의 문자열을 전달하면 실제 파이썬 리스트로 변환됩니다.
예제 코드
import json
stringA = '["Mon", 2,"Tue", 4, "Wed",3]'
# 입력 문자열 확인
print("Given string : \n", stringA)
print(type(stringA))
# loads를 사용한 변환
res = json.loads(stringA)
# 변환 결과 및 타입 확인
print("The converted list : \n", res)
print(type(res))
실행 결과
Given string : ["Mon", 2,"Tue", 4, "Wed",3] <class 'str'> The converted list : ['Mon', 2, 'Tue', 4, 'Wed', 3] <class 'list'>
JSON 표준에서는 문자열 값을 반드시 큰따옴표(")로 감싸야 한다는 점에 유의하세요. 작은따옴표를 사용하면 json.decoder.JSONDecodeError가 발생합니다.
정리 및 방법 비교
| 방법 | 특징 | 권장 상황 |
|---|---|---|
eval() | 임의의 파이썬 표현식 실행 가능, 속도 빠름 | 완전히 신뢰할 수 있는 내부 데이터만 사용 시 |
ast.literal_eval() | 리터럴만 평가, 코드 실행 불가, 안전함 | 외부 입력 처리 시 가장 권장 |
json.loads() | JSON 규격 준수 필요(큰따옴표 필수) | API 응답 등 JSON 기반 데이터 처리 시 |
세 가지 방법 모두 문자열 형태의 리스트를 실제 파이썬 리스트로 변환할 수 있습니다. 일반적으로는 안전성이 검증된 ast.literal_eval()을 우선적으로 사용하고, 데이터가 명확히 JSON 형식이라면 json.loads()를 선택하는 것이 좋습니다.