2016-06-21 70 views
-2

我有一個字符串如何把字符串轉換成一個字典在Python

"{a:'b', c:'d',e:''}" 

什麼是最便捷的方式,使其向字典

{'a':'b', 'c':'d', 'e':''} 

爲什麼會產生這麼多的人這是重複的this?在發佈之前,我已經完成了作業。在認爲別人犯了錯誤之前,請重新考慮你是否錯了。謝謝!

+0

這樣的字符串的來源是什麼? –

+0

@KevinGuan,它不同。 'eval'將爲'a'工作:'b''但不是'a:'b'' – Harrison

+0

@ juanpa.arrivillaga:我猜這是一個Javascript對象字面值(_not_ JSON,它需要屬性名稱被引用)。 – ShadowRanger

回答

2

取決於你解析什麼的複雜性,這可能是工作:

s = "{a:'b', c:'d',e:''}" 
d = dict([ 
    (x.split(':')[0].strip(), x.split(':')[1].strip("' ")) 
    for x in s.strip("{}").split(',') 
]) 
+1

哇,很酷的答案男人:) – RoadRunner

+1

謝謝:) Python很酷。 – Will

+0

是的,是的,仍然有困難做這樣的長時間表達,雖然,尼斯工作的人:) – RoadRunner

0

你也可以做這種方式,即使它不漂亮。它確實取決於你的字符串的結構。是否還有其他類型的字符串字典需要評估?

string = "{a:'b', c:'d',e:''}"[1:-1].split(",") 

d = {} 
for s in string: 
    s = s.strip() 
    key, value = s[0], s[-2] 
    if value.isalpha(): 
     d[key] = value 
    else: 
     d[key] = '' 

print(d) 

輸出:

{'e': '', 'a': 'b', 'c': 'd'} 
1

警告根據需要,如果你有一個鍵映射到你的中間空字符串這種方法是行不通的「字典」。我不會刪除這個答案,因爲我認爲這種方法仍然可以挽救。

這可能比Will的答案稍微普遍一些,但它仍然要依賴於你正在解析的確切結構。如果你的鍵值對由字母數字組成,你應該沒問題。

In [3]: import re 

In [4]: import itertools 

In [5]: my_string = "{a:'b', c:'d',e:''}" 

In [6]: temp = re.findall(r"\w", my_string) 

In [7]: temp = itertools.zip_longest(temp[0::2], temp[1::2], fillvalue = "") 

In [8]: dict(temp) 
Out[8]: {'a': 'b', 'c': 'd', 'e': ''} 

如果你想知道什麼是與拉鍊功能發生的事情,看到這些問題:

Collect every pair of elements from a list into tuples in Python

我以前itertools.zip_longest所以你可以使用的填充值,通過啓發:

Pairs from single list

+0

嗯,第二個想法,這將無法按需要工作,如果你有一個關鍵映射到你的「字典。」那麼,它可能仍然有用。 –

+0

爲什麼downvote? –

+0

看起來像某人低估了每個人。我投給你。 – Harrison

0

你可以通過使用json包實現這個;

import json 
s = '{"a":"b", "c":"d","e":"f"}' 
my_dict = json.loads(s) 
print type(my_dict) 
+1

不適用於問題 –

3

如果這是從可信源(不使用此爲一般用戶的輸入,爲eval is not secure;但話又說回來,如果你從潛在惡意用戶獲取輸入您應使用JSON格式改爲json module),您可以使用eval

source = """{e: '', a: 'b', c: 'd'}""" 

class identdict(dict): 
    def __missing__(self, key): 
     return key 

d = eval(source, identdict()) 
print(d) 

打印

{'a': 'b', 'c': 'd', 'e': ''} 

這是如何工作的是我們創建了一個新的字典子類identdict定義魔術方法__missing__。該方法被稱爲查找字典中缺少的鍵。在這種情況下,我們只是返回鍵,所以字典將鍵映射到自己。然後使用identdict實例作爲globals參數,sourceevaleval將查找來自globals映射的變量值;因爲它是一個identdict,所以訪問的每個變量的值現在很方便,現在是變量的名稱。

適用於更復雜的字符串作爲值,以及任何合適的Python文字語法。

+0

中的字符串尼斯。雖然我的內容只是字母數字,但很好學習新的東西。由於我已經接受了其他答案,我只能爲你勝利。欣賞。 – Harrison

+0

@哈里森它總是可以爲你改變接受的答案 –

+0

@AnttiHaapala偉大的小黑客!但是這個工作到底如何?我不是很瞭解這是如何通過'NameError',不應該在字典甚至處理一個缺失的值之前被提出?它是如何返回一個字符串?我在'__missing__'方法中添加了'print(type(key))',並且如果我做了'id [1]'這樣的'id''是'identdict',並且如果我做了''類似於'id [x]',其中x沒有定義,我得到一個'NameError',並且'__missing__'方法永遠不會被調用!顯然,我並不完全瞭解eval內置的功能。 –

0
import re 
str="{a:'b', c:'d',e:''}" 
dict([i.replace("'","").split(":") for i in re.findall(r"(\w+\:'.*?')",str)])