Pregunta

Tengo una cadena que se ve así:

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

¿Hay una clase / función incorporada en Python que tomará esa cadena y construirá un diccionario, como si hubiera hecho esto:

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

He examinado los módulos disponibles, pero parece que no puedo encontrar nada que coincida.


Gracias, sé cómo hacer el código relevante yo mismo, pero dado que estas soluciones más pequeñas suelen ser campos de minas que esperan suceder (es decir, alguien escribe: Nombre1 = 'Valor1 = 2';) etc., entonces generalmente prefiero alguna función previamente probada.

Lo haré yo mismo entonces.

¿Fue útil?

Solución

No hay nada incorporado, pero puede lograr esto de manera bastante simple con una comprensión del generador:

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

[Editar] Desde su actualización, indica que puede necesitar manejar las citas. Esto complica las cosas, dependiendo del formato exacto que esté buscando (qué caracteres de comillas se aceptan, qué caracteres de escape, etc.). Es posible que desee ver el módulo csv para ver si puede cubrir su formato. Aquí hay un ejemplo: (Tenga en cuenta que la API es un poco torpe para este ejemplo, ya que CSV está diseñado para iterar a través de una secuencia de registros, de ahí que las llamadas .next () que estoy haciendo solo miren la primera línea. Ajustar a satisfacer sus necesidades):

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

Dependiendo de la estructura exacta de su formato, es posible que deba escribir su propio analizador simple.

Otros consejos

Esto se acerca a hacer lo que querías:

>>> 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(';')))

Se puede hacer simplemente mediante la unión de cadenas y la comprensión de la lista

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

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

SI su Value1, Value2 son solo marcadores de posición para valores reales, también puede usar la función dict () en combinación con eval () .

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

Esto se debe a que la función dict () comprende la sintaxis dict (Name1 = 1, Name2 = 2, Name3 = 'string') . Los espacios en la cadena (por ejemplo, después de cada punto y coma) se ignoran. Pero tenga en cuenta que los valores de cadena requieren comillas.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top