我有一个像
这样的字符串s = "title='bah' name='john and jill' purple='haze' none=None i=1"
我正在寻找一种将其放入字典中的pythonic方法(以及一种不会阻塞额外空格的解决方案)?
建议?
答案 0 :(得分:5)
>>> 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'}
(如果内部字符串包含空格,或者'='
显示为除键值分隔符以外的任何内容,则无法工作。显然,这越复杂,解析起来就越难,所以...)
答案 1 :(得分:5)
如果您可以控制字符串,就像您所说的那样,您可以直接执行此操作
>>> 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'}
>>>
答案 2 :(得分:2)
>>> dictionary = {}
>>> for i in s.split():
... dictionary[i.split('=')[0]] = i.split('=')[1]
...
>>> dictionary
{'purple': "'haze'", 'i': '1', 'none': 'None', 'name': "'john'", 'title': "'bah'"}
答案 3 :(得分:0)
看起来@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
答案 4 :(得分:-1)
@gnibblers和@RanRag的组合,它们不会在空格上进行barf。 (例如title =&#39; foo bar&#39;)
s = "title='bah' name='john' purple='haze' none=None i=1"
d = eval("dict(%s)"% ",".join(s.split()))