문자열 안에 여러 요소가 담겨 있어 마치 리스트처럼 보이는 경우가 있습니다. 그런데 이 요소들이 키-값(key-value) 쌍을 나타내고 있다면, 같은 문자열을 딕셔너리로도 표현할 수 있습니다. 이 글에서는 이렇게 리스트 형태로 작성된 문자열을 파이썬 딕셔너리로 변환하는 두 가지 방법을 소개합니다.
1. split()과 슬라이싱 활용하기
첫 번째 방법은 split() 함수와 슬라이싱을 조합하는 방식입니다. 먼저 문자열 양 끝의 대괄호를 슬라이싱([1:-1])으로 제거한 뒤, 쉼표를 기준으로 요소를 나누고 각 요소를 다시 콜론(:)으로 분리하여 딕셔너리 컴프리헨션으로 키-값 쌍을 만듭니다.
예제 코드
stringA = '[Mon:3, Tue:5, Fri:11]'
# 주어진 문자열 출력
class="notranslate">print("주어진 문자열 :", stringA)
print(type(stringA))
# split과 슬라이싱으로 딕셔너리 변환
res = {sub.split(":")[0]: sub.split(":")[1] for sub in stringA[1:-1].split(", ")}
# 결과 및 타입 확인
print("변환된 딕셔너리 :", res)
print(type(res))실행 결과
주어진 문자열 : [Mon:3, Tue:5, Fri:11]
<class 'str'>
변환된 딕셔너리 : {'Mon': '3', 'Tue': '5', 'Fri': '11'}
<class 'dict'>이 방식의 특징은 모든 값이 문자열(str)로 저장된다는 점입니다. 숫자로 된 값이 필요하다면 변환 후 int() 등으로 형 변환을 추가로 해주어야 합니다.
2. eval()과 replace() 활용하기
두 번째 방법은 replace()로 대괄호 []를 중괄호 {}로 바꾼 뒤, eval() 함수로 문자열 전체를 실제 파이썬 객체(딕셔너리)로 평가하는 방식입니다. 별도의 분리 작업 없이 한 줄로 변환이 가능합니다.
예제 코드
stringA = '[18:3, 21:5, 34:11]'
# 주어진 문자열 출력
print("주어진 문자열 :", stringA)
print(type(stringA))
# eval과 replace로 딕셔너리 변환
res = eval(stringA.replace("[", "{").replace("]", "}"))
# 결과 및 타입 확인
print("변환된 딕셔너리 :", res)
print(type(res))실행 결과
주어진 문자열 : [18:3, 21:5, 34:11]
<class 'str'>
변환된 딕셔너리 : {18: 3, 21: 5, 34: 11}
<class 'dict'>흥미로운 점은 이 방법에서는 키와 값이 정수(int)로 자동 인식된다는 것입니다. eval()이 문자열을 실제 파이썬 표현식처럼 평가하기 때문입니다.
두 방법 비교 및 주의 사항
- split + 슬라이싱: 안전하고 제어가 쉬우며, 값의 타입을 직접 지정할 수 있습니다. 다만 값이 항상 문자열로 처리됩니다.
- eval + replace: 코드가 간결하고 숫자 타입이 자동 반영되지만, 입력 문자열의 형식이 엄격하게 맞아야 하며 따옴표나 공백에 민감합니다.
- 보안 경고:
eval()은 임의의 코드를 실행할 수 있으므로, 외부에서 들어온 신뢰할 수 없는 문자열에는 절대 사용하지 마세요. 가능하면 첫 번째 방법이나ast.literal_eval()을 사용하는 것이 안전합니다.