У меня есть строка, которая выглядит так:
"Name1=Value1;Name2=Value2;Name3=Value3"
Есть ли встроенный класс/функция в Python, который возьмет эту строку и построит словарь, как если бы я это сделал:
dict = {
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3"
}
Я просмотрел доступные модули, но не могу найти ничего, что соответствует.
Спасибо, я знаю, как сделать соответствующий код сам, но так как такие маленькие решения, как правило, ждут мои минные поля (т.е. кто-то пишет: Name1 = 'Value1 = 2';) и т.д., тогда я обычно предпочитаю некоторые предварительно проверенные функции.
Я сделаю это сам тогда.
Ответ 1
Там нет встроенного, но вы можете сделать это довольно просто с помощью генератора:
s= "Name1=Value1;Name2=Value2;Name3=Value3"
dict(item.split("=") for item in s.split(";"))
[Изменить] Из вашего обновления вы указываете, что вам может понадобиться обработать кавычки. Это усложняет ситуацию, в зависимости от того, какой именно формат вы ищете (какие символы символов принимаются, какие символы эвакуации и т.д.). Вы можете посмотреть модуль csv, чтобы узнать, может ли он охватывать ваш формат. Вот пример: (Обратите внимание, что API для этого примера немного неуклюжий, поскольку CSV предназначен для повторения последовательности записей, следовательно, вызовы .next(), которые я делаю, просто смотрят на первую строку. соответствуют вашим потребностям):
>>> 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'}
В зависимости от точной структуры вашего формата вам может понадобиться написать собственный простой парсер.
Ответ 2
Это близко к тому, что вы хотели:
>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
Ответ 3
Его можно просто выполнить с помощью объединения строк и списка
','. 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'
Ответ 4
ЕСЛИ ваш Value1, Value2 являются только заполнителями для действительных значений, вы также можете использовать функцию dict()
в сочетании с eval()
.
>>> s= "Name1=1;Name2=2;Name3='string'"
>>> print eval('dict('+s.replace(';',',')+')')
{'Name2: 2, 'Name3': 'string', 'Name1': 1}
Это означает, что функция dict()
понимает синтаксис dict(Name1=1, Name2=2,Name3='string')
. Пробелы в строке (например, после каждой точки с запятой) игнорируются. Но обратите внимание, что строковые значения требуют кавычек.
Ответ 5
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)