2012-04-30 35 views
6

tôi có một chuỗi python trong định dạng:có được từ điển python từ chuỗi chứa các cặp giá trị key

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

là có cách nào để chuyển đổi nó vào từ điển mà trông giống như

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

nơi mỗi mục là các cặp (khóa, giá trị) được lấy từ chuỗi. Tôi đã cố gắng tách chuỗi thành danh sách theo số

str.split() 

và sau đó xóa thủ công :, kiểm tra từng tên thẻ, thêm vào từ điển. Hạn chế của phương pháp này là: phương pháp này là khó chịu, tôi phải tự loại bỏ : cho mỗi cặp và nếu có nhiều từ 'giá trị' trong chuỗi (ví dụ, blah blah cho description), mỗi từ sẽ là một mục riêng biệt trong một danh sách mà không phải là mong muốn. Có cách nào Pythonic nhận được từ điển (sử dụng python 2,7)?

+0

Bạn ... xóa câu hỏi trước chỉ để hỏi nó một lần nữa ... –

+0

yeah .. đã có sai sót trong câu hỏi đó – srek

+0

(off-topic, nhưng) xin vui lòng không sử dụng 'str' như một tên biến. Đó là tên của [kiểu chuỗi tích hợp] (http://docs.python.org/library/functions.html#str). –

Trả lời

2

mà không 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

vui lòng không sử dụng 'str' làm tên biến. Đó là tên của kiểu chuỗi được tạo sẵn. Cùng lý do bạn không sử dụng các tên var như 'list' và' dict'. –

+0

@ShawnChin Cảm ơn! Tôi không để ý tên của OP. –

+0

Không có probs. Tôi cũng sẽ sao chép bình luận cho câu hỏi, vì vậy OP là nhận thức được. –

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

Giải thích:

\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

mức regex: trên 9000 –

0

biến thể khác của chương trình Aswini mà hiển thị các từ điển theo thứ tự ban đầu

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) 

Output

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

Các vấn đề liên quan