2012-06-11 60 views
3

到字典我有以下字符串:轉換的字符串在python

str = "{application.root.category.id:2}" 

我想上述轉換爲在python字典數據類型,如:

dict = {application.root.category.id:2} 

我嘗試使用eval()函數,這是我得到的錯誤:

AttributeError: java package 'application' has no attribute "root"

我目前的蟒蛇是< 2.3,我不能UPD吃蟒蛇> 2.3。

任何解決方案?

+1

應該是什麼字典項目的關鍵? – pepr

+1

你能解釋一下'java package'的東西嗎? – wong2

+1

你想要'{application.root.category.id:2}'還是'{「application.root.category.id」:2}'?你的問題是無法評估'application.root.category.id'。 – Eric

回答

3

首先,'字典'是類型名稱,所以不適合變量名稱。

下,不正是由於你問...

a_dict = dict([str.strip('{}').split(":"),]) 

但是,如果如我所料,你要更多的映射添加到字典中,需要採用不同的方法。

4

Python字典有不需要字符串的鍵;因此,當您編寫{a: b}時,如果它是一個字符串,則需要a左右的引號。 ({1:2},例如,整數 1映射到整數2)

所以你不能只是通過你必須eval之類的東西。你需要自己解析它。 (或者,如果它碰巧更容易,請更改產生它的任何內容以在引號周圍加上引號。)

究竟如何解析它取決於您的字典實際上可能的樣子;比如,價值本身可以是字典,還是它們總是數字,或者是什麼?這是一個簡單的,可能太粗糙的方法:

contents = str[1:-1]  # strip off leading { and trailing } 
items = contents.split(',') # each individual item looks like key:value 
pairs = [item.split(':',1) for item in items] # ("key","value"), both strings 
d = dict((k,eval(v)) for (k,v) in pairs) # evaluate values but not strings 
+2

出於安全原因,我寧願使用'int(v)'或'eval(v,{},{})'而不是普通的'eval(v)'。比較'eval(「os.remove('/ tmp/a')」,{},{})'(「name'os'is not defined」)與'eval(「os.remove('/ tmp/a ')「)'(」沒有這樣的文件或目錄:'/ tmp/a'「)。 –

+2

是的。通常使用'eval'(尤其是它簡單的一個arg形式)是一個糟糕的主意。我只是懶洋洋地做到了,因爲OP做到了:-)。 –

0

假設我有一個字符串

str='{1:0,2:3,3:4}' 
str=str.split('{}') 
mydict={} 
for every in str1.split(','): 
    z=every.split(':') 
    z1=[] 
    for every in z: 
     z1.append(int(every)) 
    for k in z1: 
     mydict[z1[0]]=z1[1] 

輸出: mydict {1: 0, 2: 1, 3: 4}