>>> 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']]}
возможно, вложенный список может реализовать это или мне нужен тип дерева?
Здесь один подход. Я полагаю, что вы можете полагаться на свои ключи, чтобы правильно представлять древовидную структуру (нет "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.
Надеюсь, это имеет смысл.
Если вам нужна структура 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.