2012-04-30 21 views
6

ho una stringa di pitone nel formato:ottenere dizionario Python dalla stringa che contiene coppie chiave valore

str = "name: srek age :24 description: blah blah" 

c'è un modo per convertirlo in dizionario che assomiglia

{'name': 'srek', 'age': '24', 'description': 'blah blah'} 

dove ogni voci sono coppie (chiave, valore) prese dalla stringa. Ho provato a dividere la stringa in lista

str.split() 

e poi rimuovere manualmente :, controllando ogni nome del tag, aggiungendo un dizionario. Lo svantaggio di questo metodo è: questo metodo è sgradevole, Devo rimuovere manualmente : per ogni coppia e se c'è una parola 'valore' multipla nella stringa (ad esempio, blah blah per description), ogni parola sarà una voce separata in una lista che non è desiderabile. C'è qualche modo pitonico per ottenere il dizionario (usando python 2.7)?

+0

È ... eliminato il precedente domanda solo per chiedere di nuovo ... –

+0

yeah .. ci sono stati errori in questa domanda – srek

+0

(off-topic, ma) si prega di non utilizzare 'str' come nome di variabile. Questo è il nome del [tipo di stringa incorporato] (http://docs.python.org/library/functions.html#str). –

risposta

2

senza re:

r = "name: srek age :24 description: blah blah cat: dog stack:overflow" 
lis=r.split(':') 
dic={} 
try : 
for i,x in enumerate(reversed(lis)): 
    i+=1 
    slast=lis[-(i+1)] 
    slast=slast.split() 
    dic[slast[-1]]=x 

    lis[-(i+1)]=" ".join(slast[:-1]) 
except IndexError:pass  
print(dic) 

{'age': '24', 'description': 'blah blah', 'stack': 'overflow', 'name': 'srek', 'cat': 'dog'} 
+0

per favore non usare 'str' come nome di variabile. Questo è il nome del tipo di stringa incorporato. Lo stesso motivo per cui non si usano nomi var come 'list' e' dict'. –

+0

@ShawnChin Grazie! Non ho notato i nomi usati da OP. –

+0

Nessun problema. Copierò anche il commento alla domanda, solo così OP è consapevole. Livello di regex –

30
>>> r = "name: srek age :24 description: blah blah" 
>>> import re 
>>> regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)") 
>>> d = dict(regex.findall(r)) 
>>> d 
{'age': '24', 'name': 'srek', 'description': 'blah blah'} 

Spiegazione:

\b   # Start at a word boundary 
(\w+)  # Match and capture a single word (1+ alnum characters) 
\s*:\s*  # Match a colon, optionally surrounded by whitespace 
([^:]*)  # Match any number of non-colon characters 
(?=   # Make sure that we stop when the following can be matched: 
\s+\w+\s*: # the next dictionary key 
|   # or 
$   # the end of the string 
)   # End of lookahead 
+4

: oltre 9000 –

0

altra variazione di programma Aswini cui visualizzare il dizionario nell'ordine originale

import os 
import shutil 
mystr = "name: srek age :24 description: blah blah cat: dog stack:overflow" 
mlist = mystr.split(':') 
dict = {} 
list1 = [] 
list2 = [] 
try: 
for i,x in enumerate(reversed(mlist)): 
    i = i + 1 
    slast = mlist[-(i+1)] 
    cut = slast.split() 
    cut2 = cut[-1] 
    list1.insert(i,cut2) 
    list2.insert(i,x) 
    dict.update({cut2:x}) 
    mlist[-(i+1)] = " ".join(cut[0:-1]) 
except: 
pass 

rlist1 = list1[::-1] 
rlist2= list2[::-1] 

print zip(rlist1, rlist2) 

uscita

[('name', 'srek'), ('age', '24'), ('description', 'blah blah'), ('cat', 'dog'), ('stack', 'overflow')]

Problemi correlati