我有一个字符串,类似于
s = "title='bah' name='john and jill' purple='haze' none=None i=1"
我正在寻找一种Pythonic方式将其放入字典中(并且不会因额外的空格而出现错误)。有什么建议吗?
我有一个字符串,类似于
s = "title='bah' name='john and jill' purple='haze' none=None i=1"
>>> from ast import literal_eval
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> dict((k, literal_eval(v)) for k, v in (pair.split('=') for pair in s.split()))
{'purple': 'haze', 'i': 1, 'none': None, 'name': 'john', 'title': 'bah'}
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> eval("dict(%s)"%s.replace(" ",","))
{'i': 1, 'purple': 'haze', 'none': None, 'name': 'john', 'title': 'bah'}
>>>
"title='foo bar' name='john'"
将变为 {'name': 'john', 'title': 'foo,bar'}
)。 - yak>>> dictionary = {}
>>> for i in s.split():
... dictionary[i.split('=')[0]] = i.split('=')[1]
...
>>> dictionary
{'purple': "'haze'", 'i': '1', 'none': 'None', 'name': "'john'", 'title': "'bah'"}
看起来@Nix在之前的答案中错过了split()的调用。
这是已经更正的代码:
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> d = eval("dict(%s)" % ','.join(s.split()))
>>> d
{'i': 1, 'purple': 'haze', 'none': None, 'name': 'john', 'title': 'bah'}
>>>
原始代码:
s = "title='bah' name='john' purple='haze' none=None i=1"
d = eval("dict(%s)"% ",".join(s))
会产生以下错误:
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> d = eval("dict(%s)"% ",".join(s))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
dict(t,i,t,l,e,=,',b,a,h,', ,n,a,m,e,=,',j,o,h,n,', ,p,u,r,p,l,e,=,',h,a,z,e,', ,n,o,n,e,=,N,o,n,e, ,i,=,1)
^
SyntaxError: invalid syntax
from operator import methodcaller
from ast import literal_eval
kv_split = methodcaller('split', '=', 1)
{k: literal_eval(v) for k, v in map(kv_split, s.split(" "))}
# {'purple': 'haze', 'i': 1, 'none': None, 'name': 'john', 'title': 'bah'}
s = "title='bah' name='john' purple='haze' none=None i=1"
d = eval("dict(%s)"% ",".join(s.split()))
eval("dict(%s)" % s.replace(' ',',') )
,但是不要告诉任何人我告诉过你。 - Doboy