сделать дерево на основе ключа каждого элемента в списке

1
>>> s
[{'000000': [['apple', 'pear']]}, {'100000': ['good', 'bad']}, {'200000': ['yeah', 'ogg']}, {'300000': [['foo', 'foo']]}, {'310000': [['#'], ['#']]}, {'320000': ['$', ['1']]}, {'321000': [['abc', 'abc']]}, {'322000': [['#'], ['#']]}, {'400000': [['yeah', 'baby']]}]

>>> for i in s:
...     print i
...
{'000000': [['apple', 'pear']]}
{'100000': ['good', 'bad']}
{'200000': ['yeah', 'ogg']}
{'300000': [['foo', 'foo']]}
{'310000': [['#'], ['#']]}
{'320000': ['$', ['1']]}
{'321000': [['abc', 'abc']]}
{'322000': [['#'], ['#']]}
{'400000': [['yeah', 'baby']]}

Я хочу создать дерево на основе ключа каждого элемента в списке.

результатом будет логика:

{'000000': [['apple', 'pear']]}
    {'100000': ['good', 'bad']}
    {'200000': ['yeah', 'ogg']}
    {'300000': [['foo', 'foo']]}
        {'310000': [['#'], ['#']]}
        {'320000': ['$', ['1']]}
           {'321000': [['abc', 'abc']]}
           {'322000': [['#'], ['#']]}
    {'400000': [['yeah', 'baby']]}

возможно, вложенный список может реализовать это или мне нужен тип дерева?

  • 0
    Вложение структур данных Python работает просто отлично - вам не нужен тип дерева. Но что вы собираетесь делать с деревом, когда оно у вас будет? Вам это действительно нужно? Разве вы не можете просто посмотреть на вещи по соответствующему ключу?
  • 1
    Вы заинтересованы в том, чтобы получить такой вывод или иметь объекты, представляющие этот результат в логике?
Показать ещё 1 комментарий
Теги:
list
tree
nested
wxpython

2 ответа

2
Лучший ответ

Здесь один подход. Я полагаю, что вы можете полагаться на свои ключи, чтобы правильно представлять древовидную структуру (нет "310000" без "300000" - это вызовет проблемы, если вы не будете обрабатывать недостающие узлы при добавлении их в свой TreeCtrl.)

Я бы начал с реорганизации данных, поэтому вы можете получить связанные данные для каждого node по ключу, а также сохранить некоторую дополнительную информацию в каждом node.

# original list of dicts
tree = [{'000000': [['apple', 'pear']]},
        {'100000': ['good', 'bad']},
        {'200000': ['yeah', 'ogg']},
        {'300000': [['foo', 'foo']]},
        {'310000': [['#'], ['#']]},
        {'320000': ['$', ['1']]},
        {'321000': [['abc', 'abc']]},
        {'322000': [['#'], ['#']]},
        {'400000': [['yeah', 'baby']]}]


# reorganize your data into a dict:
# {'000000': {'data':[['apple', 'pear']]},
#  '100000': {'data':['good', 'bad']}, ...
tree = dict([(item.keys()[0], {'data':item[item.keys()[0]]})
                  for item in tree])

Затем просмотрите идентификатор родителя для каждого node, заменив последнюю ненулевую цифру ключа нулем, а затем отложив ее обратно до исходного количества цифр. Обновите каждый dict с родительским идентификатором:

for key in tree_dict.keys():

    parent_id = key.strip('0')[:-1].ljust(len(key), '0')

    # If it all zeros, set it to None so we know the parent is root
    if int(parent_id) == 0:
        parent_id = None

    tree_dict[key].update({'parent':parent_id})

Это позволяет вам хорошо использовать wx.TreeCtrl, так как каждый node теперь имеет ссылку на своего родителя:

{'000000':{'data': [['apple', 'pear']], 'parent': None},
 '100000':{'data': ['good', 'bad'], 'parent': None},
 '200000':{'data': ['yeah', 'ogg'], 'parent': None},
 '300000':{'data': [['foo', 'foo']], 'parent': None},
 '310000':{'data': [['#'], ['#']], 'parent': '300000'},
 '320000':{'data': ['$', ['1']], 'parent': '300000'},
 '321000':{'data': [['abc', 'abc']], 'parent': '320000'},
 '322000':{'data': [['#'], ['#']], 'parent': '320000'},
 '400000':{'data': [['yeah', 'baby']], 'parent': None}}

Добавьте корень node в свой wx.TreeCtrl, а затем перейдите по отсортированным клавишам dict, добавив данные из каждого элемента в TreeCtrl, но вы хотите, чтобы он отображался. И для каждого добавляемого элемента обновите его dict снова с помощью TreeItemId, возвращаемого AppendItem() или InsertItem(). Если значение "parent" в dict равно None, вы знаете, что родитель должен быть корневым node. Если это не так, используйте родительское значение для извлечения TreeItemId родительского node, которое должно было быть обновлено при добавлении его в TreeCtrl.

Надеюсь, это имеет смысл.

0

Если вам нужна структура python, вы можете использовать это:

{'000000': ([['apple', 'pear']], [
  {'100000': (['good', 'bad'], )},
  {'200000': (['yeah', 'ogg'], )},
  {'300000': ([['foo', 'foo']],[
     {'310000': ([['#'], ['#']], )},
     {'320000': (['$', ['1']],[
       {'321000': ([['abc', 'abc']], )},
       {'322000': ([['#'], ['#']], )}
  ])},
  {'400000': ([['yeah', 'baby']], )}
])}

например. в каждой паре ключей-значений хранится кортеж в качестве значения, так что первым элементом кортежа будет node data ([['apple', 'pear']] например), а второй элемент кортежа будет быть списком потомков node.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню