我有一组嵌套列表,可以分为三组:
A(子元素是析取的,线颜色为绿色),例如
listA = {
‘a1’: ['b1', 'a2'],
‘a2’: ['c1', 'c2']
}
B(子元素有序连词,线颜色为橙色),例如
listB = {
‘b1’: ['c4', 'c5', 'c7'],
‘b2’:['c3', 'b1']
}
函数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"]
问题:
我如何处理这样一个事实,有一些重复的节点得到一个结果,如前所述?在
谢谢你的帮助。在
重复节点问题
为了避免重复节点问题,您应该为每个节点命名一个唯一的名称,并使用
label
作为显示的名称。例如更改:收件人:
^{pr2}$产生:
避免
try/except
流对于正常的程序流,最好使用}。例如,而不是:
if/else
,而不是{使用:
Graphviz python包
您可以使用^{} python package ,而不是自己编写点文件。在
相关问题 更多 >
编程相关推荐