我有一个名为nesteddict的类,派生自collections.defaultdict,它包含一组嵌套的字典:
import collections
class nesteddict(collections.defaultdict):
"""Nested dictionary structure.
Based on Stack Overflow question 635483
"""
def __init__(self):
collections.defaultdict.__init__(self, nesteddict)
self.locked = False
Run Code Online (Sandbox Code Playgroud)
我希望能够执行一个操作,将所有nesteddict对象转换为python-native dict对象.
一种方法是使用一种方法:
def todict(self):
for (key,val) in self.iteritems():
if isinstance(val,nesteddict):
val.todict()
self[key] = dict(val)
self = dict(self)
Run Code Online (Sandbox Code Playgroud)
这是成功用dict类型替换所有内部映射对象,但方法中的最后一个语句显然不起作用.
这是一个例子:
In [93]: a = pyutils.nesteddict()
In [94]: a[1][1] = 'a'
In [95]: a[1][2] = 'b'
In [96]: a[2][1] = 'c'
In [97]: a[2][2] = 'd'
In [98]: print a
defaultdict(<class 'pyutils.nesteddict'>, {1: defaultdict(<class 'pyutils.nesteddict'>, {1: 'a', 2: 'b'}), 2: defaultdict(<class 'pyutils.nesteddict'>, {1: 'c', 2: 'd'})})
In [99]: a.todict()
In [100]: print a
defaultdict(<class 'pyutils.nesteddict'>, {1: {1: 'a', 2: 'b'}, 2: {1: 'c', 2: 'd'}})
Run Code Online (Sandbox Code Playgroud)
有没有办法在python中执行此操作?有一个方法将其对象转换为另一种类型?如果没有,那么这是一个很好的选择.请注意,实际中的数据类型可能很大,因此最好不要只复制然后返回它.
谢谢!
乌里
将它作为一个免费功能,当你在它时,考虑一个更实用的风格方法:
def undefaulted(x):
return dict(
(k, undefaulted(v))
for (k, v) in x.iteritems()
) if isinstance(x, nesteddict) else x
a = undefaulted(a)
Run Code Online (Sandbox Code Playgroud)