2016-09-16 116 views
0

我必須拆分一個字符串,看起來像;字符串拆分成包含Python中的列表字典

'{ a:[(b,c), (d,e)] , b: [(a,c), (c,d)]}' 

並將其轉換爲字典,其值是包含元組的列表;

{'a':[('b','c'), ('d','e')] , 'b': [('a','c'), ('c','d')]} 

對我來說, 上面的字符串只是一個例子。所以我試圖做的是我從服務器獲得響應。在服務器端,響應是包含列表和內容的正確字典。但它以某種方式以字符串格式發送給我的客戶端。例如

u"{'write_times': [ (1.658935546875, 1474049078179.095), (1.998779296875, 1474049078181.098)], 'read_times': [(0.825927734375, 1474049447696.7249), (1.4638671875, 1474049447696.7249)]}" 

我想它就像它在服務器端。

{'write_times': [ ('1.65893554687', '1474049078179.095'), ('1.998779296875', '1474049078181.098')], 'read_times': [('0.825927734375', '1474049447696.7249'), ('1.4638671875', '1474049447696.7249')]} 

您提出的解決方案可能無法正常工作。有任何想法嗎?

+0

你「信任」字符串嗎?如果它是從用戶輸入生成的,則它不受信任。這很重要,因爲如果字符串是可信的,可能會使用'eval'。 –

+0

感謝您的回覆。 @James K我編輯了一下我的問題。 – beenum

回答

3

重要的是要知道這個字符串是從哪裏來的,但是,假設這是你所擁有的,你不能改變這種狀況是非常重要的,你可以預先處理字符串將字母數字爲報價和使用ast.literal_eval()安全 EVAL它:

>>> from ast import literal_eval 
>>> import re 
>>> 
>>> s = '{ a:[(b,c), (d,e)] , b: [(a,c), (c,d)]}' 
>>> literal_eval(re.sub(r"(\w+)", r"'\1'", s)) 
{'a': [('b', 'c'), ('d', 'e')], 'b': [('a', 'c'), ('c', 'd')]} 
+0

打算髮布相同的解決方案,但意識到它會中斷'{a:[(b,c,else)]}'。不知道這是否是一個問題。 –

+1

@JustinNiessner好點,這個解決方案在這一點上並不可靠,並且可以以許多不同的方式破解,但我希望這是OP可以開始的事情(或者停下來,如果意識到問題的複雜性:))。有趣的知道這是從哪裏來的..謝謝! – alecxe

+0

感謝您的快速回復,夥計們! – beenum