преобразуйте строку в dict, использующий понимание списка

Я столкнулся с той же проблемой в прошлом. Если Вы нуждаетесь в более сложных списках, рассматриваете создание Вашего собственного синтаксического анализатора путем наследования 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 ]
15
задан martineau 26 November 2018 в 22:18
поделиться

7 ответов

Вы имеете в виду это?

>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}
29
ответ дан 1 December 2019 в 01:17
поделиться

Как насчет однострочного текста без понимания списка?

 foo="a=0 b=1 c=3"
 ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
 print ans
{'a': 0, 'c': 3, 'b': 1}
3
ответ дан 1 December 2019 в 01:17
поделиться

Попробуйте следующее:

dict([x.split('=') for x in s.split()])
3
ответ дан 1 December 2019 в 01:17
поделиться
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}
1
ответ дан 1 December 2019 в 01:17
поделиться

Мне иногда нравится этот подход, особенно когда логика создания ключей и значений более сложна:

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()))
2
ответ дан 1 December 2019 в 01:17
поделиться

Мне нравится решение С.Лотта, но я предложил другой вариант.
Поскольку у вас уже есть строка, которая чем-то похожа на то, как вы ее написали, вы можете просто адаптировать ее к синтаксису 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 и оцените. НО, конечно, вам следует выполнить дополнительные проверки работоспособности, чтобы убедиться, что туда не вводится код!

-3
ответ дан 1 December 2019 в 01:17
поделиться

Я бы сделал это:

def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])
0
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: