繁体   English   中英

在python中如何将字典值从字符串更改为字典?

[英]In python how do I change dictionary values from strings into dictionaries?

我有以下形式的字典: d={741178: u'{"width":37.8365,"height":150,"length":234},{"width":35.7,"height":178,"length":122}',741179: u'{"width":98.67,"height":180,"length":994},{"width":98.79,"height":167.8,"length":154.22}'}

我怎样才能把它变成字典的字典? 我试过了:

for k, v in d.items():
    v = ast.literal_eval(v)

但这不起作用。 由于我的每个伪嵌套字典实际上都是一个字符串,我如何在字典中更改它们的数据类型?

您可以使用ast.literal_eval()json.loads() ,在这种情况下输出几乎相同。 但是,对于 JSON,您必须将字符串括在方括号中,因为它们都包含两个以逗号分隔的字典,因此获取它们的唯一合理方法是将它们作为字典列表。 对于 Python 文字,将方括号去掉(或用括号替换它们)会导致每对以逗号分隔的字典被解释为 2 元组(应该是双精度数,但已经具有不同的含义)。

我个人推荐使用json.loads() ,因为 JSON 目前是新项目中最常用的数据交换格式。 如果您的字符串源可以添加方括号以生成有效的 JSON,那将是最好的。

import ast
import json

d = {741178: u'{"width":37.8365,"height":150,"length":234},{"width":35.7,"height":178,"length":122}',
     741179: u'{"width":98.67,"height":180,"length":994},{"width":98.79,"height":167.8,"length":154.22}'}

p = {k: ast.literal_eval(v)   for k, v in d.items()}
j = {k: json.loads('['+v+']') for k, v in d.items()}

print(p)
print(j)

# {741178: ({'width': 37.8365, 'height': 150, 'length': 234}, {'width': 35.7, 'height': 178, 'length': 122}), 741179: ({'width': 98.67, 'height': 180, 'length': 994}, {'width': 98.79, 'height': 167.8, 'length': 154.22})}
# {741178: [{'width': 37.8365, 'height': 150, 'length': 234}, {'width': 35.7, 'height': 178, 'length': 122}], 741179: [{'width': 98.67, 'height': 180, 'length': 994}, {'width': 98.79, 'height': 167.8, 'length': 154.22}]}

如您所见,唯一的区别是( )[ ]

我已经更正了 json 并删除了不必要的双引号和逗号如果您想将字典作为值,您必须将值作为字典数组。

import json    
d={741178:
       u'{"width":37.8365,"height":150,"length":234},'
       u'{"width":35.7,"height":178,"length":122}',
   741179: u'{"width":98.67,"height":180,"length":994},'
           u'{"width":98.79,"height":167.8,"length":154.22}'

   }
for key, value in d.items():
    d[key]= json.loads('['+value+']')
print(d)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM