我有一个包含字典的字符串,我想将其转换为列表,但在执行相同操作时无法删除单引号。
有人可以帮我弄清楚这里缺少什么吗?
>>> a = '{"src_ports": [7] , "dst_ports": [8]}'
我想要的是:
[{"src_ports": [7] , "dst_ports": [8]}]
但我得到的是:
>>> a = [a]
>>> a
['{"src_ports": [7] , "dst_ports": [8]}']
编辑: 随着ast,字典元素的顺序发生了变化,我需要保持完整。
>>> import ast
>>> b = [ast.literal_eval(a)]
>>> b
[{'dst_ports': [8], 'src_ports': [7]}]
答案 0 :(得分:3)
>>> import ast
>>> [ast.literal_eval(a)]
[{'src_ports': [7], 'dst_ports': [8]}]
json.loads
>>> import collections
>>> import json
>>> [json.loads(a, object_pairs_hook=collections.OrderedDict)]
[OrderedDict([('src_ports', [7]), ('dst_ports', [8])])]
(保留订单。)
OrderedDict
请注意,{{1}}仍然是字典,因此您可以像访问普通字符一样访问其元素。
答案 1 :(得分:0)
您可以将ast.literal_eval()
功能用作更安全的eval()
:
import ast
a = '{"src_ports": [7] , "dst_ports": [8]}'
b = [ast.literal_eval(a)]
# [{'dst_ports': [8], 'src_ports': [7]}]
更新 - 如果您的结构保持不变,如果您想保留订单,则可以将json
模块与collections.OrderedDict
结合使用。请记住,Python dict
和JSON通常都是无序结构:
import json
import collections
a = '{"src_ports": [7] , "dst_ports": [8]}'
b = json.loads(a, object_pairs_hook=collections.OrderedDict)
但是如果你将它打印出来,你就可以获得类似OrderedDict([(u'src_ports', [7]), (u'dst_ports', [8])])
的内容,但是你的订单会被保留下来,例如,如果你以后将其序列化或循环播放它。