사전의 문자열 표현을 사전으로 변환
변환하려면 어떻게 해야 하나요?str
의 표현dict
(다음 스트링 등)으로 변환합니다.dict
?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
사용하지 않는 것이 좋습니다.eval
또 뭐가 있을까요?
그 주된 이유는 그가 작성한 제 동료 중 한 명이 모든 입력을 문자열로 변환하기 때문입니다.저는 이 문제를 해결하기 위해 그의 수업을 수정할 기분이 아닙니다.
빌트인을 사용할 수 있습니다.
>>> import ast
>>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}")
{'muffin': 'lolz', 'foo': 'kitty'}
이것은 사용하는 것보다 안전합니다.eval
. 자체 문서에서는 다음과 같이 기술하고 있습니다.
>> 도움말(ast.disc_eval)모듈 ast의 함수 literal_eval 도움말: 리터럴_eval(node_or_string)표현식 노드 또는 Python을 포함하는 문자열을 안전하게 평가합니다.표현.제공된 문자열 또는 노드는 다음 문자열로만 구성될 수 있습니다.Python 리터럴 구조: 문자열, 숫자, 튜플, 목록, 딕트, 부울란,없습니다.
예를 들어 다음과 같습니다.
>>> eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 208, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 206, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mongo'
>>> ast.literal_eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string
https://docs.python.org/3.8/library/json.html
JSON의 디코더는 키와 값 주위에 큰따옴표가 필요하지만 이 문제를 해결할 수 있습니다.해킹을 교체해도 괜찮으시다면...
import json
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
json_acceptable_string = s.replace("'", "\"")
d = json.loads(json_acceptable_string)
# d = {u'muffin': u'lolz', u'foo': u'kitty'}
키 또는 값의 일부로 작은 따옴표가 있는 경우 부적절한 문자 치환으로 인해 실패합니다.이 솔루션은 평가 솔루션에 대한 거부감이 강한 경우에만 권장됩니다.
json 작은따옴표 상세: jQuery.parseJSON이 JSON에서 이스케이프된 단일 따옴표로 인해 "Invalid JSON" 오류를 발생시킵니다.
사용.json.loads
:
>>> import json
>>> h = '{"foo":"bar", "foo2":"bar2"}'
>>> d = json.loads(h)
>>> d
{u'foo': u'bar', u'foo2': u'bar2'}
>>> type(d)
<type 'dict'>
OP의 예:
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Yaml을 사용하여 다음과 같은 종류의 비표준 json을 문자열로 처리할 수 있습니다.
>>> import yaml
>>> s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
>>> s
"{'muffin' : 'lolz', 'foo' : 'kitty'}"
>>> yaml.load(s)
{'muffin': 'lolz', 'foo': 'kitty'}
요약:
import ast, yaml, json, timeit
descs=['short string','long string']
strings=['{"809001":2,"848545":2,"565828":1}','{"2979":1,"30581":1,"7296":1,"127256":1,"18803":2,"41619":1,"41312":1,"16837":1,"7253":1,"70075":1,"3453":1,"4126":1,"23599":1,"11465":3,"19172":1,"4019":1,"4775":1,"64225":1,"3235":2,"15593":1,"7528":1,"176840":1,"40022":1,"152854":1,"9878":1,"16156":1,"6512":1,"4138":1,"11090":1,"12259":1,"4934":1,"65581":1,"9747":2,"18290":1,"107981":1,"459762":1,"23177":1,"23246":1,"3591":1,"3671":1,"5767":1,"3930":1,"89507":2,"19293":1,"92797":1,"32444":2,"70089":1,"46549":1,"30988":1,"4613":1,"14042":1,"26298":1,"222972":1,"2982":1,"3932":1,"11134":1,"3084":1,"6516":1,"486617":1,"14475":2,"2127":1,"51359":1,"2662":1,"4121":1,"53848":2,"552967":1,"204081":1,"5675":2,"32433":1,"92448":1}']
funcs=[json.loads,eval,ast.literal_eval,yaml.load]
for desc,string in zip(descs,strings):
print('***',desc,'***')
print('')
for func in funcs:
print(func.__module__+' '+func.__name__+':')
%timeit func(string)
print('')
결과:
*** short string ***
json loads:
4.47 µs ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
builtins eval:
24.1 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
ast literal_eval:
30.4 µs ± 299 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
yaml load:
504 µs ± 1.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
*** long string ***
json loads:
29.6 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
builtins eval:
219 µs ± 3.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
ast literal_eval:
331 µs ± 1.89 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
yaml load:
9.02 ms ± 92.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
결론: json.loads를 선호합니다.
스트링을 항상 신뢰할 수 있는 경우eval
(또는 사용)literal_eval
어떤 끈이 있어도 안전합니다.)그렇지 않으면 파서가 필요합니다.JSON 파서(simplejson 등)는 JSON 스킴에 맞는 콘텐츠만 저장하는 경우 작동합니다.
사용하다json
.그ast
라이브러리는 메모리를 많이 소비하며 속도가 느립니다.156Mb의 텍스트 파일을 읽어야 하는 프로세스가 있습니다.Ast
변환 사전이 5분 지연됨json
메모리 60% 절감으로 1분!
string = "{'server1':'value','server2':'value'}"
#Now removing { and }
s = string.replace("{" ,"")
finalstring = s.replace("}" , "")
#Splitting the string based on , we get key value pairs
list = finalstring.split(",")
dictionary ={}
for i in list:
#Get Key Value pairs separately to store in dictionary
keyvalue = i.split(":")
#Replacing the single quotes in the leading.
m= keyvalue[0].strip('\'')
m = m.replace("\"", "")
dictionary[m] = keyvalue[1].strip('"\'')
print dictionary
libs는 사용되지 않습니다(libs2:
dict_format_string = "{'1':'one', '2' : 'two'}"
d = {}
elems = filter(str.isalnum,dict_format_string.split("'"))
values = elems[1::2]
keys = elems[0::2]
d.update(zip(keys,values))
메모: 하드코드가 되어 있기 때문에split("'")
는 데이터가 "단일 따옴표"로 묶인 문자열에서만 작동합니다.
에서는 2: python3는 랩해야 .filter()
로로 합니다.list()
목록을 가져옵니다.
Siva Kameswara Rao Munipalle의 최적화된 코드
s = s.replace("{", "").replace("}", "").split(",")
dictionary = {}
for i in s:
dictionary[i.split(":")[0].strip('\'').replace("\"", "")] = i.split(":")[1].strip('"\'')
print(dictionary)
언급URL : https://stackoverflow.com/questions/988228/convert-a-string-representation-of-a-dictionary-to-a-dictionary
'programing' 카테고리의 다른 글
MySQL에서 데이터베이스를 드롭하면 "Error droping database errno: 66"이 반환됩니다. (0) | 2022.09.19 |
---|---|
Vue 2 목록에 새 항목 추가 (0) | 2022.09.19 |
로컬 컴퓨터의 PHP 서버를 선택하십시오. (0) | 2022.09.19 |
Java resource as File (0) | 2022.09.19 |
HTML 콘텐츠에서 스크립트 태그 제거 (0) | 2022.09.19 |