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

2024-09-28 15:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为nesteddict的类集合.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对象的操作。在

一种方法是使用一种方法:

^{pr2}$

这在用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


Tags: 对象方法inimportself类型initcollections
3条回答

我刚用嵌套的defaultdicts来面对这个问题。我的解决方案:

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

最好使用{}而不是dict(),因为调用 dict()的构造函数限制关键字参数的数量 到255。参见:What is a maximum number of arguments in a Python function?

dict(a)将为您提供从defaultdict派生的任何对象的默认dict。也就是说,假设您没有重写所需的特殊方法。在

把它作为一个自由函数来做,当你在做的时候,考虑一个更实用的方法:

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

a = undefaulted(a)

相关问题 更多 >