Признаюсь, я не совсем уверен, что вы имеете в виду в вопросе, но позвольте мне предложить следующее решение.
Если я правильно понимаю одну вещь, ваша конечная цель - каким-то образом преобразовать вашу собственную древовидную структуру, котораяиспользует dict
в качестве хеш-таблицы для листьев каждого узла и может генерировать случайные пути этого дерева из него, равномерно распределенного.
Так что я думаю, ваш код должен был выглядеть примерно так:
import random
tree_node1 = {'value':1,'childs':[]}
tree_node2 = {'value':2,'childs':[]}
tree_node3 = {'value':3,'childs':[tree_node1]}
tree_node4 = {'value':4,'childs':[tree_node1, tree_node2]}
tree_node = {'value': 5, 'childs': [tree_node3,tree_node4]}
def random_path_recursive(node, trace = None):
if trace is None:
trace = []
trace.append(node['value'])
num_childs = len(node['childs'])
if num_childs == 0:
return trace
else:
node = node['childs'][random.randint(0,num_childs-1)]
return random_path_recursive(node,trace)
print(random_path_recursive(tree_node))
Я не использовал какие-либо существенные структуры для простоты.
Во-первых, кроме рекурсивной функции, в этом подходе нет ничего плохого.Это поможет вам сохранить древовидную структуру и получить желаемый результат.Тем не менее, если вам потребуется много времени, это не будет очень быстрым без каких-либо потоков и параллелизма.
Вы также можете преобразовать рекурсивную функцию в нерекурсивную:
def random_path_nonrecursive(node):
trace = []
while True:
trace.append(node['value'])
num_childs = len(node['childs'])
if num_childs == 0:
return trace
node = node['childs'][random.randint(0, num_childs - 1)]
print(random_path_nonrecursive(tree_node))
Наконец, если вы преобразуете его в файл данных Pandas, будет еще проще выбрать случайную строку.
Вы можете сделать это как
def make_rows(node, rows=None, trace=None):
rows = [] if rows is None else rows
trace = [] if trace is None else trace
trace.append(node['value'])
num_childs = len(node['childs'])
if num_childs == 0:
rows.append(trace)
return rows
else:
for subnode in node['childs']:
make_rows(subnode,rows, list(trace))
return rows
import pandas as pd
def convert_to_df(node, headers=None):
return pd.DataFrame(make_rows(node), columns=headers)
df = convert_to_df(tree_node, ['level_1','level_2','level_3'])
print(df.iloc[random.randint(0, df.shape[0])])
Хорошоудачи!