请,我需要生成如下的上下文树,我使用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)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')
答案 0 :(得分:0)
这是您想要的吗?
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')]
答案 1 :(得分:0)
是,非常感谢,这可以解决我的问题,但是由于我需要生成一棵树,因此需要对列表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]