сделать дерево на основе ключа каждого элемента в списке - PullRequest
1 голос
/ 14 января 2011
>>> 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']]}

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

Ответы [ 2 ]

2 голосов
/ 14 января 2011

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

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

# 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])

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

for key in tree_dict.keys():

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

    # If it's 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, поскольку каждый узел теперь имеет ссылку на своего родителя:

{'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}}

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

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

0 голосов
/ 14 января 2011

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

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

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

...