web-dev-qa-db-fra.com

Fractionnement d'une chaîne séparée par des points-virgules en un dictionnaire, dans Python

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

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

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

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

J'ai parcouru les modules disponibles mais je n'arrive pas à trouver quoi que ce soit qui corresponde.


Merci, je sais comment créer le code pertinent moi-même, mais comme ces petites solutions sont généralement des champs de mines qui attendent de se produire (c'est-à-dire que quelqu'un écrit: Name1 = 'Value1 = 2';) etc., alors je préfère généralement des fonction testée.

Je le ferai moi-même alors.

Il n'y a pas de fonction intégrée, mais vous pouvez le faire assez simplement avec une compréhension de générateur:

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

[Modifier] À partir de votre mise à jour, vous indiquez que vous devrez 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 regarder le module csv pour voir s'il peut couvrir votre format. Voici un exemple: (Notez que l'API est un peu maladroite pour cet exemple, car CSV est conçu pour parcourir une séquence d'enregistrements, d'où les appels .next () que je fais pour ne regarder que la première ligne. Ajuster à 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 cependant écrire votre propre analyseur simple.

126
Brian

Cela revient à faire ce que vous vouliez:

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

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

Cela peut être fait simplement par jointure de chaîne et compréhension de 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'
0
vijay