我有一個名爲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-實例本地字典對象。要做到這一點
一種方法是有一個方法:
def todict(self):
for (key,val) in self.iteritems():
if isinstance(val,nesteddict):
val.todict()
self[key] = dict(val)
self = dict(self)
這是成功地用字典類型更換所有的內部映射對象,但在方法的最後一條語句顯然是行不通的。
下面是一個例子:
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
「我會就像能夠執行操作的一個實例一樣,將所有嵌套對象轉換爲Python本地字典對象。 「爲什麼?它已經是一個'dict'對象。你不需要轉換任何東西。它是'defaultdict'的一個子類,這意味着它**是** dict'。 – 2010-12-14 18:53:37
加載數據後,我想「鎖定」它。實現這一點的一種方法是使default_factory方法成爲引發KeyError的函數,這看起來工作正常。但是,我在使用cPickle序列化這個類時遇到了麻煩。轉換爲純字典將允許輕鬆序列化(包括使用json),並將以類似的方式有效地鎖定字典。 – 2010-12-16 20:03:44
@ S.Lott pickle是想要轉換爲純字典的常見原因:否則,要取消它,你需要帶上專用字典的定義,例如。 'infinite_defaultdict = lambda:defaultdict(infinite_defaultdict)'。 – 2013-09-06 13:24:13