Проблема сериализации двоичного дерева Python - PullRequest
3 голосов
/ 23 сентября 2011

У меня есть класс бинарного дерева, как показано ниже:

class BTree:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

    def __unicode__(self):
        return "%s" % self.data

и у меня есть другой метод сериализации дерева, указанный ниже:

class JTree(object):
    def __init__(self, id, children=None): 
        self.id = id 
        if children is None:
            children=[]
        self.children = children

def encode_tree(obj):
    if not isinstance(obj, JTree):
        raise TypeError("%r is not JSON serializable" % (o,))

    return obj.__dict__

затем я заполняю данные двоичного дерева, как показано ниже:

bt = BTree("1")
bt.left =BTree("2")
bt.right=BTree("3")

поэтому, если я сериализую данные, я могу получить следующий результат:

tree = JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)])

print json.dumps(tree, default=encode_tree)


{"id": "1", "children": [{"id": "2", "children": []}, {"id": "3", "children": []}]}

Проблема в том, что я не могу понять, как запрограммировать кусок кода для генерации результата. Это означает, что я хочу иметь генератор или рекурсивную функцию для запуска кода:

JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)])

Может кто-нибудь дать мне идею? Спасибо

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Мне кажется, что вы хотите простую рекурсивную функцию, такую ​​как:

def convert_to_jtree(bt):
    return JTree(bt.data, [convert_to_jtree(bt.left) if bt.left else None,
                          convert_to_jtree(bt.right) if bt.right else None])

или что-то очень похожее.

0 голосов
/ 23 сентября 2011

Модуль json может только сериализовать диктанты, списки, строки, числа, логические значения и None. Вместо использования пользовательских классов для этого рассмотрите возможность использования plain-ol dict s. Кроме того, вы можете создать подкласс json.JsonEncoder и переопределить метод default, чтобы он возвращал один из этих типов для вашего пользовательского класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...