我有一组嵌套列表,可以分为三组:
A(子元素是析取,线条颜色为绿色),例如
listA = { ‘a1’: ['b1', 'a2'], ‘a2’: ['c1', 'c2'] }
B(子元素是有序连接,线条颜色为橙色),例如
listB = { ‘b1’: ['c4', 'c5', 'c7'], ‘b2’:['c3', 'b1'] }
- C(最终元素 - 叶节点)
该函数combinations
遍历嵌套列表并返回所有可能的组合(最后只包含 C 类型的元素,因此是叶节点)。该功能write_nodes
有助于用彩色线条编写节点。该调用write_nodes('task', inputlist)
用于创建 init 节点:
def write_nodes(node, subnotes):
for k in subnotes:
if node in type_a:
text_file.write("{} -> {} [color=\"green\"]\n".format(node, k))
elif (node in type_b) or (node is 'task'):
text_file.write("{} -> {} [color=\"orange\"]\n".format(node, k))
write_nodes('task', inputlist)
def combinations(actions):
if len(actions)==1:
action= actions[0]
if action not in type_c:
root = action
try:
actions= type_a[action]
write_nodes(root, actions)
except KeyError:
try:
actions= type_b[action]
write_nodes(root, actions)
except KeyError:
#action is of type C, the only possible combination is itself
yield actions
else:
#action is of type B (conjunction), combine all the actions
for combination in combinations(actions):
yield combination
else:
#action is of type A (disjunction), generate combinations for each action
for action in actions:
for combination in combinations([action]):
yield combination
else:
#generate combinations for the first action in the list
#and combine them with the combinations for the rest of the list
action= actions[0]
for combination in combinations(actions[1:]):
for combo in combinations([action]):
yield combo + combination
示例输入(有序连词):
['a1', 'b2', 'c6']
示例结果:
['c4', 'c5', 'c7', 'c3', 'c4', 'c5', 'c7', 'c6']
['c1', 'c3', 'c4', 'c5', 'c7', 'c6']
['c2', 'c3', 'c4', 'c5', 'c7', 'c6']
task -> a1 [color="orange"]
task -> b2 [color="orange"]
task -> c6 [color="orange"]
b2 -> c3 [color="orange"]
b2 -> b1 [color="orange"]
b1 -> c4 [color="orange"]
b1 -> c5 [color="orange"]
b1 -> c7 [color="orange"]
a1 -> b1 [color="green"]
a1 -> a2 [color="green"]
b1 -> c4 [color="orange"]
b1 -> c5 [color="orange"]
b1 -> c7 [color="orange"]
a2 -> c1 [color="green"]
a2 -> c2 [color="green"]
问题:
我该如何处理这个事实,有一些重复的节点可以获得上述结果?
谢谢你的帮助。