2016-09-16 117 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