2012-02-16 3 views
3

У меня есть строка, какстроки kwargs к kwargs

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

Ищу для вещего способа положить, что в словарь (и решение, которое не давится дополнительные пробела)?

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

+0

Вас могут возникнуть проблемы, если один из ключей/значений имеет «=» символ в нем –

+0

Это обыкновение .. я иметь контроль над тем, что люди используют. – Nix

+3

, если у вас есть «полный контроль», вы можете сделать 'eval (« dict (% s) »% s.replace ('', ','))', но не говорите никому, я вам говорил, что – Doboy

ответ

-1

сочетание @gnibblers и @RanRag, не блевать на пробельные. (Например, название = «Foo бар»)

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

I (heart) анонимный голос. Может кто-нибудь объяснить мне, почему я могу исправить? – Nix

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'} 

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

+0

Hey Nix , это был бы правильный способ сделать это. Очень просто. – ericraio

+0

не может импортировать AST это python 2.5 – Nix

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'"} 
+0

Обратите внимание. Почему нисходящий? – RanRag

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'} 
>>> 
+0

приятный один - питонический! – shahjapan

+0

Следует отметить, что это изменит аргументы с пробелами ('' title = 'foo bar' name = 'john' "' -> '{'name': 'john', 'title': 'foo, bar'} '). – yak

+0

@yak это правда, и в результате я не могу использовать это ... – Nix

Смежные вопросы