我目前正在做一个项目,这个项目应该生成一个有向图,其中每个顶点都是一个深度嵌套的列表. 要启动该过程,需要一个深度嵌套的列表,然后应该复制和修改该列表. 例如:
Initial vertex: [[1, 1], [1, 1]]
Resulting vertices: [[1, 1], [1, 0]] x 4, [[1, 1], [0, 0]] x 2, [[0, 0], [0, 0]]
Initial vertex: [[1, 0], [1, 1]]
Resulting vertices: [[1, 0], [0, 0]], [[1, 0], [1, 0]] x 2, [[1, 1], [0, 0]] x 2, [[0, 0], [0, 0]]
每一份 list 都被认为是对称的:[[1, 0], [0, 0]] == [[0, 1], [0, 0]] == [[0, 0], [1, 0]] == [[0, 0], [0, 1]]
如果生成的顶点等于已有顶点的顶点或与1对称,则只会创建已有顶点的边.
我目前正在try 使用递归算法来解决这个问题.问题是我需要复制父顶点的整个嵌套列表,只更改相关的子列表,我还没有找到解决方案. 为了判断两个顶点是否相等,我首先递归地对每个列表进行排序,然后将排序后的列表相互比较,这似乎是可行的.
def sort(lst):
ordered = []
for ele in sorted(lst):
if isinstance(ele, list):
ele = sort(ele)
ordered.append(ele)
return ordered
将每个值设置为0的朴素递归算法:
def destroy(lst):
failed = []
for ele in lst:
if isinstance(ele, list):
ele = destroy(ele)
else:
ele = 0
failed.append(ele)
return failed
它的工作原理是:
作为输入的是深度为n(这里n=2)的嵌套列表:[[1, 1], [1, 1]]
该算法应该遍历这些嵌套列表,并首先将最深列表(深度n)中的每1个设置为0,然后一个接一个.
[[0, 1], [1, 1]]
[[1, 0], [1, 1]]
[[1, 1], [0, 1]]
[[1, 1], [1, 0]]
在遍历深度为n的所有列表之后,它继续遍历深度为n-1的所有列表.由于这些列表包含列表或嵌套列表,因此应该复制这些列表的 struct .副本应仅包含零.
[[0, 0], [1, 1]]
[[1, 1], [0, 0]]
当n-1完成时,它应该上升到深度n-2并继续.在本例中,n-2是最高级别,因此它只会导致
[[0, 0], [0, 0]]
然后,我可以比较所有新创建的嵌套列表,方法是首先递归排序,然后判断相等以"合并"它们.
我发现,您可以使用iterTos.Companies_With_Replace来生成所有唯一的嵌套列表.剩下的问题是,换句话说,它为图形生成了我的所有顶点,但我错过了过渡/边.
states = [0, 1]
depth = 2
for _ in range(depth):
states = list(map(list, itertools.combinations_with_replacement(states, states)))