Domanda

Ho una stringa che assomiglia a questa:

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

Esiste una classe / funzione integrata in Python che prenderà quella stringa e costruirà un dizionario, come se avessi fatto questo:

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

Ho esaminato i moduli disponibili ma non riesco a trovare nulla che corrisponda.


Grazie, so come creare personalmente il codice pertinente, ma dal momento che soluzioni così piccole sono in genere campi minati in attesa di accadere (cioè qualcuno scrive: Nome1 = 'Valore1 = 2';) ecc., Di solito preferisco alcune funzioni pre-testate.

Allora lo farò io.

È stato utile?

Soluzione

Non è incorporato, ma puoi farlo abbastanza semplicemente con una comprensione del generatore:

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

[Modifica] Dal tuo aggiornamento indichi che potresti dover gestire le offerte. Questo complica le cose, a seconda del formato esatto che stai cercando (quali caratteri di quotazione sono accettati, quali caratteri di escape ecc.). Potresti voler guardare il modulo CSV per vedere se può coprire il tuo formato. Ecco un esempio: (Nota che l'API è un po 'goffa per questo esempio, poiché CSV è progettato per iterare attraverso una sequenza di record, quindi le chiamate .next () che sto effettuando per guardare solo la prima riga. soddisfare le tue esigenze):

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

A seconda della struttura esatta del formato, tuttavia, potrebbe essere necessario scrivere il proprio parser semplice.

Altri suggerimenti

Questo si avvicina al fare quello che volevi:

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

Può essere fatto semplicemente mediante l'unione di stringhe e la comprensione dell'elenco

','. join (['% s =% s'% x per x in d.items ()])

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

SE il tuo valore1, valore2 sono solo segnaposto per valori effettivi, puoi anche utilizzare la funzione dict () in combinazione con eval () .

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

Questo perché la funzione dict () comprende la sintassi dict (Name1 = 1, Name2 = 2, Name3 = 'string') . Gli spazi nella stringa (ad es. Dopo ogni punto e virgola) vengono ignorati. Nota che i valori di stringa richiedono virgolette.

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top