1

この口述から取得する方法:

    cats = [
    {'parent_id': False, 'id': 1, 'title': u'All'},
    {'parent_id': False, 'id': 2, 'title': u'Toys'},
    {'parent_id': 2, 'id': 3, 'title': u'Toypads'},
    {'parent_id': 3, 'id': 4, 'title': u'Green'},
    ]

このようなもの?

cats = [
{'parent_id': False, 'id': 1, 'title': u'All'},
{'parent_id': False,
 'children': [{'parent_id': 2,
               'children': [{'parent_id': 3, 'id': 4,
                             'title': u'Green'}],
               'id': 3, 'title': u'Toypads'},
              [{'parent_id': 3, 'id': 4, 'title': u'Green'}]],
 'id': 2, 'title': u'Toys'}
]

Jinja2でmenu\sub-menuを構築するために必要です。私は非常に悪いコードを書きました。それはよりエレガントな解決策になるでしょう。

    q = dict(zip([i['id'] for i in cats], cats))

    from collections import defaultdict
    parent_map = defaultdict(list)

    for item in q.itervalues():
        parent_map[item['parent_id']].append(item['id'])

    def tree_level(parent):
        for item in parent_map[parent]:
            yield q[item]
            sub_items = list(tree_level(item))
            if sub_items:
                for ca in cats:
                    if ca['id'] == item:
                        cats[cats.index(ca)]['children'] = sub_items
                        for s_i in sub_items:
                            try:
                                for ca_del_child in cats:
                                    if ca_del_child['id'] == s_i['id']:
                                        del cats[cats.index(ca_del_child)]
                            except:
                                pass
                yield sub_items
    for i in list(tree_level(False)):
        pass
4

2 に答える 2

4

これはかなり簡潔な解決策です:

cats = [{'parent_id': False, 'id': 1, 'title': u'All'},
        {'parent_id': False, 'id': 2, 'title': u'Toys'},
        {'parent_id': 2, 'id': 3, 'title': u'Toypads'},
        {'parent_id': 3, 'id': 4, 'title': u'Green'},]

cats_dict = dict((cat['id'], cat) for cat in cats)

for cat in cats:
    if cat['parent_id'] != False:
        parent = cats_dict[cat['parent_id']]
        parent.setdefault('children', []).append(cat)

cats = [cat for cat in cats if cat['parent_id'] == False]

Falseとの比較は通常は必要ありませんが、idまたはparent_idが0の猫がいる場合は、ここで使用する必要があります。この場合、親のいない猫のNone代わりに使用します。False

于 2012-04-06T18:44:21.627 に答える
2

それは次のように行うことができます:

# Step 1: index all categories by id and add an element 'children'
nodes = {}
for cat in cats:
    nodes[cat['id']] = cat
    cat['children'] = []

# Step 2: For each category, add it to the parent's children
for index, cat in nodes.items():
    if cat['parent_id']:
        nodes[cat['parent_id']]['children'].append(cat)

# Step 3: Keep only those that do not have a parent
cats = [c for c in nodes.values() if not c['parent_id']]

各ノードには、と呼ばれる属性があります'children'。これは、空のリストまたは1つ以上のノードを持つリストの場合があります。空のリストが必要ない場合はchildren、ステップ2とステップの間にリストを削除するだけで、の各カテゴリから削除できますnodes

parent_idまた、上記は、指定されたノードが実際に存在することを前提としていることに注意してください。最後に、if not c['parent_id']IDがゼロのノードが存在する場合にも当てはまるため、発生する可能性がある場合は注意する必要があります。

于 2012-04-06T18:43:59.400 に答える