Разделение строки, разделенной точкой с запятой, в словарь в Python - PullRequest
77 голосов
/ 09 октября 2008

У меня есть строка, которая выглядит следующим образом:

"Name1=Value1;Name2=Value2;Name3=Value3"

Есть ли встроенный класс / функция в Python, который будет принимать эту строку и создавать словарь, как если бы я сделал это:

dict = {
    "Name1": "Value1",
    "Name2": "Value2",
    "Name3": "Value3"
}

Я просмотрел доступные модули, но не могу найти ничего подходящего.


Спасибо, я знаю, как сделать соответствующий код сам, но так как такие небольшие решения, как правило, являются минными полями, ожидающими выполнения (т.е. кто-то пишет: Name1 = 'Value1 = 2';) и т. Д., То я обычно предпочитаю некоторые предварительно протестированные функции.

Тогда я сделаю это сам.

Ответы [ 6 ]

126 голосов
/ 09 октября 2008

Нет встроенного, но вы можете сделать это довольно просто с пониманием генератора:

s= "Name1=Value1;Name2=Value2;Name3=Value3"
dict(item.split("=") for item in s.split(";"))

[Изменить] Из вашего обновления вы указываете, что вам, возможно, придется обрабатывать цитаты. Это усложняет ситуацию, в зависимости от того, какой именно формат вы ищете (какие символы кавычек принимаются, какие escape-символы и т. Д.). Вы можете посмотреть на модуль 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'}

В зависимости от точной структуры вашего формата вам может потребоваться написать собственный простой анализатор.

5 голосов
/ 01 марта 2011

Это близко к тому, что вы хотели:

>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
2 голосов
/ 04 марта 2019
s1 = "Name1=Value1;Name2=Value2;Name3=Value3"

dict(map(lambda x: x.split('='), s1.split(';')))
0 голосов
/ 23 декабря 2014

Это можно сделать просто путем объединения строк и понимания списка

','. 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'
0 голосов
/ 24 апреля 2013

ЕСЛИ ваши 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'). Пробелы в строке (например, после каждой точки с запятой) игнорируются. Но обратите внимание, что строковые значения требуют кавычек.

0 голосов
/ 27 марта 2013
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...