141

我正在努力解决以下问题:我想转换OrderedDict这样的:

OrderedDict([('method', 'constant'), ('data', '1.225')])

变成这样的常规字典:

{'method': 'constant', 'data':1.225}

因为我必须将它作为字符串存储在数据库中。转换后,订单不再重要,所以无论如何我都可以保留已订购的功能。

感谢您的任何提示或解决方案,

4

8 回答 8

125
>>> from collections import OrderedDict
>>> OrderedDict([('method', 'constant'), ('data', '1.225')])
OrderedDict([('method', 'constant'), ('data', '1.225')])
>>> dict(OrderedDict([('method', 'constant'), ('data', '1.225')]))
{'data': '1.225', 'method': 'constant'}
>>>

但是,要将其存储在数据库中,最好将其转换为 JSON 或 Pickle 等格式。使用 Pickle,您甚至可以保留订单!

于 2013-11-23T19:33:28.820 回答
92

尽管这是一个老问题,但我想说,dict如果您在有序字典中有一个有序字典,那么使用将无济于事。可以转换那些递归有序字典的最简单方法是

import json
from collections import OrderedDict
input_dict = OrderedDict([('method', 'constant'), ('recursive', OrderedDict([('m', 'c')]))])
output_dict = json.loads(json.dumps(input_dict))
print output_dict
于 2014-12-09T06:50:53.883 回答
8

OrderedDict像这样将您转换为常规很容易Dict

dict(OrderedDict([('method', 'constant'), ('data', '1.225')]))

如果您必须将其作为字符串存储在数据库中,则使用 JSON 是一种方法。这也很简单,您甚至不必担心转换为常规dict

import json
d = OrderedDict([('method', 'constant'), ('data', '1.225')])
dString = json.dumps(d)

或者直接将数据转储到文件中:

with open('outFile.txt','w') as o:
    json.dump(d, o)
于 2013-11-23T19:54:01.800 回答
6

如果您正在寻找不使用json模块的递归版本:

def ordereddict_to_dict(value):
    for k, v in value.items():
        if isinstance(v, dict):
            value[k] = ordereddict_to_dict(v)
    return dict(value)
于 2017-01-25T23:53:48.710 回答
3

这是看起来最简单且适用于 python 3.7 的方法

from collections import OrderedDict

d = OrderedDict([('method', 'constant'), ('data', '1.225')])
d2 = dict(d)  # Now a normal dict

现在检查一下:

>>> type(d2)
<class 'dict'>
>>> isinstance(d2, OrderedDict)
False
>>> isinstance(d2, dict)
True

注意:这也有效,并给出相同的结果 -

>>> {**d}
{'method': 'constant', 'data': '1.225'}
>>> {**d} == d2
True

还有这个——

>>> dict(d)
{'method': 'constant', 'data': '1.225'}
>>> dict(d) == {**d}
True

干杯

于 2018-07-17T16:58:24.397 回答
1

您可以使用“dict_constructor”参数。

xmltodict.parse(text, attr_prefix='',dict_constructor=dict)

于 2021-05-20T14:09:16.393 回答
-2

处理嵌套字典和可迭代但不使用json模块的版本。嵌套字典变为dict,嵌套迭代变为list,其他所有内容都原样返回(包括字典键和字符串/字节/字节数组)。

def recursive_to_dict(obj):
    try:
        if hasattr(obj, "split"):    # is string-like
            return obj
        elif hasattr(obj, "items"):  # is dict-like
            return {k: recursive_to_dict(v) for k, v in obj.items()}
        else:                        # is iterable
            return [recursive_to_dict(e) for e in obj]
    except TypeError:                # return everything else
        return obj
于 2020-09-13T19:45:30.543 回答
-3

它的简单方法

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
于 2017-05-26T09:31:12.897 回答