Как я могу создать контекстное дерево, используя Python? - PullRequest
0 голосов
/ 01 мая 2019

Пожалуйста, мне нужно создать контекстное дерево следующим образом: я работаю с python, так как многие советуют мне, что это один из лучших языков для этого типа программ. Проблема, которую я должен решить, заключается в следующем:

У меня есть 3 вектора

  • v1 = [0, 1]
  • v2 = [0, 1, 2]
  • v3 = [‘a’, ‘b’, ‘c’]

Зная, что мой начальный вектор IV=[0,0,’a’], мне нужно сгенерировать дерево всех возможных следующих векторов на основе следующих условий:

  • если v1=0, на следующем уровне v1 может принимать два возможных значения v1=0 или v1=1, но если v1=1, оно никогда не вернется к 0, поэтому оно всегда будет равно 1 ( v1 = 1) * +1025 *
  • Каким бы ни было значение v2, на следующем уровне он всегда будет генерировать все возможности, v2=0, v2=1 и v2=3
  • Если v3=’a’, то на следующем уровне v3 будет либо v3=’a’, либо v3=‘b’; Если v3=’b’, то на следующем уровне v3 может быть равен v3=’a’ или v3=‘b’ или v3=‘c’; Если v3=’c’, то на следующем уровне v3 будет либо v3=‘c’, либо v3=‘b’

Итак, из первого вектора [0,0,a]-> [0,0,a] [0,0,b] [0,1,a] [0,1,b] [0,2,a] [0,2,b] [1,0,a] [1,0,b] [1,1,a] [1,1,b] [1,2,a] [1,2,b]

Затем для каждого сгенерированного вектора я должен выполнять ту же процедуру, пока не достигну 5 уровней глобального дерева.

Не могли бы вы помочь мне, пожалуйста?

Я начал с этого кода для генерации первого уровня, но теперь я застрял на генерации следующих уровней, выполняя следующие условия:

import numpy as np
import itertools
v1 = [0, 1]
v2 = [0, 1, 2]
v3 = ['a', 'b', 'c']
array = [v1, v2, v3]
AllCombinations = list(itertools.product(*array))
m1 = np.asarray(AllCombinations)
root = (0, 0, 'a')

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Да, большое спасибо, это может решить мою проблему, но, поскольку мне нужно сгенерировать дерево, мне нужно повторить ту же процедуру для каждого сгенерированного элемента в списке t.Для этого я добавил следующие строки:

    t = get_combinations(*array, *root)
    array2 = []
    for item in t:
    root = t[t.index(item)]
    t = get_combinations(*array, *root)
    array2.append(t)

Array2 представляет собой список списков [[[0,0, 'a'], ... [1,1, 'b']],[.....], [....] ...] и чтобы иметь возможность повторять обработку столько времени, сколько мне нужно, я должен сохранить каждый подсписок отдельно в новой переменной L [i],но я не нашел способа сделать это.Допустим, у меня есть [[1,1,1] [1,0,1] [1,0,0]], мне нужно использовать цикл for, чтобы получить следующий результат: List1 = [1,1,1] List2 = [1,0,1] List3 [1,0,0]

0 голосов
/ 01 мая 2019

Это то, что вы хотите:

import itertools

def get_combinations(v1, v2, v3, v1_root, v2_root, v3_root):
    # using the list and roots
    # fidn the list we actually want combination for.
    v1 = v1[v1.index(v1_root):]
    # v2 = v2[v2.index(v2_root):]
    if v3_root == 'a':
        v3 = ['a', 'b']
    elif v3_root == 'c':
        v3 = ['c', 'b']
    return list(itertools.product(*[v1, v2, v3]))


v1 = [0, 1]
v2 = [0, 1, 2]
v3 = ['a', 'b', 'c']
array = [v1, v2, v3]
root = (0, 0, 'a')

t = get_combinations(*array, *root)
print(t)

Выход:

[(0, 0, 'a'), (0, 0, 'b'), (0, 1, 'a'), (0, 1, 'b'), (0, 2, 'a'), (0, 2, 'b'), (1, 0, 'a'), (1, 0, 'b'), (1, 1, 'a'), (1, 1, 'b'), (1, 2, 'a'),(1, 2, 'b')]
...