Как реализовать древовидную структуру в Python с помощью namedtuple

У меня есть ключевое слово, например. дружелюбный. Оно рождает дочернее слово, т.е. теплый, нисходящий от родительского слова, например. друг.

from collections import namedtuple

keyword = 'friendly'
childword = 'warm'
parentword = 'friend'

connect=namedtuple(keyword,'children parents')
output = connect([childword],[parentword])  

В результате я могу использовать output.children, чтобы увидеть дочерние элементы моего nodeword. Однако то, что я действительно хочу сделать, это ввести

friendly.children # instead of output.children

чтобы увидеть детей ключевого слова дружественных. Как я могу это сделать? Я совершенно новичок в Python; Я даже не уверен, что это выполнимо.


person wen    schedule 21.02.2015    source источник
comment
Возможно, namedtuple не является подходящей структурой данных для того, что вы пытаетесь сделать, но это немного неясно. Обычно с подобными вопросами лучше не спрашивать Как мне сделать _______ с помощью определенного инструмента _______? и многое другое Это то, что я пробовал, и вот почему это не сработало; что я мог сделать по-другому? Потому что, возможно, вы изначально выбрали не тот инструмент. Поскольку название вашего вопроса на самом деле не означает ничего полезного.   -  person Iguananaut    schedule 21.02.2015
comment
Если вы, например, пытаетесь построить древовидную структуру, а это звучит так, как будто вы это делаете, уже существует множество материалов, представляющих деревья в Python.   -  person Iguananaut    schedule 21.02.2015
comment
Как представить деревья в Python?   -  person wen    schedule 21.02.2015
comment
Я думаю, что классы могут быть ближе к тому, что вы хотите   -  person Padraic Cunningham    schedule 21.02.2015


Ответы (1)


Если вы хотите определить древовидную структуру, вы можете использовать для этого namedtuple:

from collections import namedtuple

TreeNode = namedtuple('TreeNode', ['word', 'children'])

friend = TreeNode(word='friend', children=[])
friendly = TreeNode(word='friendly', children=[])
warm = TreeNode(word='warm', children=[])

friend.children.append(friendly)
friendly.children.append(warm)

print(friendly.children)

что получается:

[TreeNode(word='warm', children=[])]

Однако это очень похоже на C; вам, вероятно, лучше иметь единую структуру данных Graph или Tree, в которой хранятся граничные отношения, например:

children = dict()
children['friend'] = ['friendly']
children['friendly'] = ['warm']

def parents(word):
    ps = []
    for k in children:
        if word in children[k]:
            ps.append(k)
    return ps

print(children['friendly'])
print(parents('friendly'))

который приходит с

['warm']
['friendly']

Доступна статья Реализация графиков в Python, которая может оказаться полезной.

person Anthony Towns    schedule 21.02.2015