如何将派生递归数据类型转换为基本数据类型?

0 投票
4 回答
747 浏览
提问于 2025-04-16 08:32

我有一个叫做 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

我希望能有一个操作,可以把这个类的实例中的所有 nesteddict 对象转换成 Python 自带的 dict 对象。

一种方法是创建一个方法:

def todict(self):
    for (key,val) in self.iteritems():
        if isinstance(val,nesteddict):
            val.todict()
            self[key] = dict(val)
    self = dict(self)

这个方法成功地把所有内部的映射对象替换成了 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'}})

在 Python 中有没有办法做到这一点?也就是说,能否有一个方法把它的对象转换成另一种类型?如果不行,有什么好的替代方案?请注意,实际使用中的数据类型可能很大,所以最好不要只是简单地复制一份再返回。

谢谢!
Uri

4 个回答

1

dict(a) 可以从任何继承自 defaultdict 的对象中得到一个默认字典。前提是你没有修改那些必要的特殊方法。

3

我最近也遇到了这个问题,使用了嵌套的 defaultdict。我的解决办法是:

def dictify(d):
    return {k:dictify(v) for k,v in d.items()} if \
        isinstance(d,nesteddict) else d

使用 {} 比使用 dict() 更好,因为调用 dict() 的构造函数会限制关键字参数的数量最多只能有 255 个。想了解更多,可以看看这个链接:Python 函数的最大参数数量是多少?

5

把它做成一个自由函数,同时考虑一下更函数式的风格:

def undefaulted(x):
  return dict(
    (k, undefaulted(v))
    for (k, v) in x.iteritems()
  ) if isinstance(x, nesteddict) else x

a = undefaulted(a)

撰写回答