Pergunta

Eu tenho uma string que se parece com isso:

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

Existe um built-in de classe / função em Python que vai levar essa corda e construir um dicionário, como se eu tivesse feito isso:

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

Eu olhei através dos módulos disponíveis, mas não consigo encontrar nada com o termo.


Obrigado, eu sei como fazer o código relevante mim mesmo, mas uma vez que tais soluções bem pequenos são geralmente campos minados à espera de acontecer (ou seja, alguém escreve:. Name1 = 'Value1 = 2';) etc, então eu geralmente preferem alguma função pré-testado.

Eu vou fazer isso sozinho, então.

Foi útil?

Solução

Não há embutido, mas você pode fazer isso de forma muito simples com uma compreensão do gerador:

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

[Edit] A partir da sua atualização, você indicar que você pode precisar para lidar com citando. Isso faz as coisas complicar, dependendo do que o formato exato que você está procurando (o que Citação caracteres são aceitos, caracteres que de fuga etc.). Você pode querer olhar para o módulo de csv para ver se ele pode cobrir o seu formato. Aqui está um exemplo: (Note que a API é um pouco desajeitado para este exemplo, como CSV é projetado para percorrer uma seqüência de registros, daí o .next () chama que eu estou fazendo para olhar apenas na primeira linha ajustar. atender às suas necessidades):

>>> 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'}

Dependendo da estrutura exata de seu formato, pode ser necessário para escrever seu próprio analisador simples no entanto.

Outras dicas

Este chega perto de fazer o que você queria:

>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
s1 = "Name1=Value1;Name2=Value2;Name3=Value3"

dict(map(lambda x: x.split('='), s1.split(';')))

Ele pode ser feito simplesmente por cordas juntar e compreensão da lista

', ' join ([' % s =% s'% x para x em d.items ()])

>>d = {'a':1, 'b':2}
>>','.join(['%s=%s'%x for x in d.items()])
>>'a=1,b=2'

Se o seu valor1, valor2 são espaços reservados apenas para valores reais, você também pode usar a função dict() em combinação com eval().

>>> s= "Name1=1;Name2=2;Name3='string'"
>>> print eval('dict('+s.replace(';',',')+')')
{'Name2: 2, 'Name3': 'string', 'Name1': 1}

Esta é beacuse a função dict() entender o dict(Name1=1, Name2=2,Name3='string') sintaxe. Espaços na cadeia (por exemplo, depois de cada ponto e vírgula) são ignoradas. Mas note-se os valores de cadeia exigem citando.

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top