цепочка кваргов к кваргам - PullRequest
       12

цепочка кваргов к кваргам

3 голосов
/ 16 февраля 2012

У меня есть строка, подобная

s = "title='bah' name='john and jill' purple='haze' none=None i=1"

Я ищу питонический способ поместить это в словарь (и решение, которое не душит лишние пробелы)?

Предложения?

Ответы [ 5 ]

5 голосов
/ 16 февраля 2012

Если у вас есть контроль над строками, как вы говорите, вы можете просто сделать это

>>> 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'}
>>> 
5 голосов
/ 16 февраля 2012
>>> 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'}

(Это не сработает, если внутренние строки содержат пробелы или если '=' отображается как что-то отличное от разделителя ключ-значение. Очевидно, что чем сложнее это становится, тем труднее его анализировать, поэтому ...)

2 голосов
/ 16 февраля 2012
>>> dictionary = {}
>>> for i in s.split():
...     dictionary[i.split('=')[0]] = i.split('=')[1]
...
>>> dictionary
{'purple': "'haze'", 'i': '1', 'none': 'None', 'name': "'john'", 'title': "'bah'"}
0 голосов
/ 25 мая 2018

Похоже, @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
0 голосов
/ 27 февраля 2012

Комбинация @gnibblers и @RanRag, которая не преграждает пробелы. (например, title = 'foo bar')

s = "title='bah' name='john' purple='haze' none=None i=1"
d = eval("dict(%s)"% ",".join(s.split()))
...