Question

J'ai une chaîne qui ressemble à ceci:

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

Existe-t-il une classe / fonction intégrée à Python qui prendra cette chaîne et construira un dictionnaire, comme si j'avais fait ceci:

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

J'ai parcouru les modules disponibles, mais je ne trouve rien qui corresponde.

Merci, je sais comment créer moi-même le code approprié, mais comme de telles solutions minimes sont généralement des champs de mines en attente (c’est-à-dire que quelqu'un écrit: Nom1 = 'Valeur1 = 2'), etc., alors je préfère généralement certaines fonctions pré-testées.

Je le ferai moi-même alors.

Était-ce utile?

La solution

Il n'y a pas d'intégré, mais vous pouvez y arriver assez facilement avec un générateur de compréhension:

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

[Modifier] Dans votre mise à jour, vous indiquez que vous devez peut-être gérer les devis. Cela complique les choses, selon le format exact que vous recherchez (quels caractères de citation sont acceptés, quels caractères d’échappement, etc.). Vous voudrez peut-être consulter le module csv pour voir s'il peut couvrir votre format. Voici un exemple: (Notez que l’API est un peu maladroit pour cet exemple, étant donné que CSV est conçu pour parcourir une séquence d’enregistrements, d’où les appels .next () que je suis en train de faire pour regarder uniquement la première ligne. Ajuster en fonction. répondre à vos besoins):

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

En fonction de la structure exacte de votre format, vous devrez peut-être écrire votre propre analyseur syntaxique simple.

Autres conseils

Cela revient à faire ce que vous vouliez:

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

Cela peut se faire simplement par chaîne, rejoindre et comprendre la liste

',' join (['% s =% s'% x pour x dans d.items ()])

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

SI votre Value1, Value2 ne sont que des espaces réservés pour les valeurs réelles, vous pouvez également utiliser la fonction dict () en combinaison avec eval () .

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

C’est parce que la fonction dict () comprend la syntaxe dict (Nom1 = 1, Nom2 = 2, Nom3 = 'chaîne') . Les espaces de la chaîne (après chaque point-virgule, par exemple) sont ignorés. Notez toutefois que les valeurs de chaîne nécessitent des guillemets.

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top