Разделение строки, разделенной точкой с запятой, на словарь в Python
у меня есть строка, которая выглядит так:
"Name1=Value1;Name2=Value2;Name3=Value3"
есть ли встроенный класс / функция в Python, который возьмет эту строку и построит словарь, как если бы я сделал это:
dict = {
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3"
}
Я просмотрел все доступные модули, но не могу найти ничего подходящего.
Спасибо, я знаю, как сделать соответствующий код сам, но так как такие небольшие решения, как правило, минные поля ждут, чтобы произойти (т. е. кто-то пишет: Name1= 'Value1=2';) и др. тогда я обычно предпочитаю некоторые предварительно опробовать функции.
тогда я сделаю это сам.
5 ответов:
там нет встроенного, но вы можете сделать это довольно просто с генератором понимания:
s= "Name1=Value1;Name2=Value2;Name3=Value3" dict(item.split("=") for item in s.split(";"))
[Edit] из вашего обновления вы указываете, что вам может потребоваться обработать цитирование. Это усложняет ситуацию, в зависимости от того, какой точный формат вы ищете (какие символы цитаты принимаются, какие символы escape и т. д.). Вы можете посмотреть на модуль csv, чтобы увидеть, если он может покрыть ваш формат. Вот пример: (обратите внимание, что API немного неуклюжий для этого примера, поскольку CSV предназначен для итерации через последовательность записей, следовательно .далее () звонки, которые я делаю, чтобы просто посмотреть на первую строку. Настроить в соответствии с вашими потребностями):
>>> s = "Name1='Value=2';Name2=Value2;Name3=Value3" >>> dict(csv.reader([item], delimiter='=', quotechar="'").next() for item in csv.reader([s], delimiter=';', quotechar="'").next()) {'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1=2'}
в зависимости от точной структуры вашего формата, вам может потребоваться написать свой собственный простой парсер.
Это приближается к тому, что вы хотели:
>>> import urlparse >>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3") {'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
Это может быть просто сделано путем соединения строк и понимания списка
','.join (['%s=%s ' %x для x в d. items ()])
>>d = {'a':1, 'b':2} >>','.join(['%s=%s'%x for x in d.items()]) >>'a=1,b=2'
easytiger $ cat test.out test.py | sed 's/^/ /' p_easytiger_quoting:1.84563302994 {'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1'} p_brian:2.30507516861 {'Name2': 'Value2', 'Name3': "'Value3'", 'Name1': 'Value1'} p_kyle:7.22536420822 {'Name2': ['Value2'], 'Name3': ["'Value3'"], 'Name1': ['Value1']} import timeit import urlparse s = "Name1=Value1;Name2=Value2;Name3='Value3'" def p_easytiger_quoting(s): d = {} s = s.replace("'", "") for x in s.split(';'): k, v = x.split('=') d[k] = v return d def p_brian(s): return dict(item.split("=") for item in s.split(";")) def p_kyle(s): return urlparse.parse_qs(s) print "p_easytiger_quoting:" + str(timeit.timeit(lambda: p_easytiger_quoting(s))) print p_easytiger_quoting(s) print "p_brian:" + str(timeit.timeit(lambda: p_brian(s))) print p_brian(s) print "p_kyle:" + str(timeit.timeit(lambda: p_kyle(s))) print p_kyle(s)