2012-04-30 26 views
6

anahtar değer çiftlerini içeren dizesinden piton sözlüğü almak dize alınan (anahtar, değer) çiftleridir. Bir sözlüğe ekleyereki biçimde bir piton dizesi

str.split() 

ve ardından manuel olarak her etiket adı kontrol : kaldırarak listeye dize bölme çalıştı. Bu yöntemin dezavantajı: bu yöntem kötü, her bir çift için :'u elle kaldırmak zorundayım ve dize içinde çoklu sözcük 'değeri' varsa (örneğin description için blah blah), her bir sözcük ayrı bir girişte olacaktır. İstenmeyen liste. Sözlüğü (python 2.7 kullanarak) almak için herhangi bir Pythonic yolu var mı?

+0

Çıktı sadece kullanmayın lütfen bu soruya –

+0

evet .. vardı yanlışlıkları sormak (konu dışı ama) için değişken ad olarak str'. Bu, yerleşik dizge türünün adıdır (http://docs.python.org/library/functions.html#str). – srek

+0

yılında ... yine –

cevap

2

re olmadan:

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

Lütfen değişken adı olarak 'str' kullanmayın. Yerleşik dize türünün adı budur. Aynı sebepten 'list' ve' dict' gibi var isimleri kullanmazsınız. –

+0

@ShawnChin Teşekkürler! OP tarafından kullanılan isimleri fark etmedim. –

+0

Probs yok. Yorumun yanı sıra, OP'nin de farkında olduğu gibi, yorumu da kopyalayacağım. –

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

Açıklama:

\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

regex seviyesi: 9000'den fazla –

0
orijinal amacıyla sözlük görüntüler Aswini programı

diğer varyasyon

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) 

Sen ... Bir önceki soruyu silinen

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