Я столкнулся с той же проблемой в прошлом. Если Вы нуждаетесь в более сложных списках, рассматриваете создание Вашего собственного синтаксического анализатора путем наследования ConfigParser. Тогда Вы перезаписали бы получить метод с этим:
def get(self, section, option):
""" Get a parameter
if the returning value is a list, convert string value to a python list"""
value = SafeConfigParser.get(self, section, option)
if (value[0] == "[") and (value[-1] == "]"):
return eval(value)
else:
return value
С этим решением Вы также будете в состоянии определить словари в своем файле конфигурации.
, Но быть осторожным! Это не столь безопасно: это означает, что любой мог выполнить код через Ваш файл конфигурации. Если бы безопасность не является проблемой в Вашем проекте, я рассмотрел бы использование непосредственно классов Python как файлов конфигурации. Следующее намного более мощно и потребляемо, чем файл ConfigParser:
class Section
bar = foo
class Section2
bar2 = baz
class Section3
barList=[ item1, item2 ]
Вы имеете в виду это?
>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}
Как насчет однострочного текста без понимания списка?
foo="a=0 b=1 c=3"
ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
print ans
{'a': 0, 'c': 3, 'b': 1}
Попробуйте следующее:
dict([x.split('=') for x in s.split()])
from cgi import parse_qsl
text = "a=0 b=1 c=3"
dic = dict((k, int(v)) for k, v in parse_qsl(text.replace(' ', '&')))
print dic
печатает
{'a': 0, 'c': 3, 'b': 1}
Мне иногда нравится этот подход, особенно когда логика создания ключей и значений более сложна:
s = "a=0 b=1 c=3"
def get_key_val(x):
a,b = x.split('=')
return a,int(b)
ans = dict(map(get_key_val,s.split()))
Мне нравится решение С.Лотта, но я предложил другой вариант.
Поскольку у вас уже есть строка, которая чем-то похожа на то, как вы ее написали, вы можете просто адаптировать ее к синтаксису python, а затем eval () it:)
import re
string = "a=0 b=1 c=3"
string2 = "{"+ re.sub('( |^)(?P<id>\w+)=(?P<val>\d+)', ' "\g<id>":\g<val>,', string) +"}"
dict = eval(string2)
print type(string), type(string2), type(dict)
print string, string2, dict
Регулярное выражение здесь довольно сырое и не улавливает все возможные Python идентификаторы, но я хотел сделать его простым для простоты. Конечно, если у вас есть контроль над генерацией входной строки, просто сгенерируйте ее в соответствии с синтаксисом python и оцените. НО, конечно, вам следует выполнить дополнительные проверки работоспособности, чтобы убедиться, что туда не вводится код!
Я бы сделал это:
def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])