我目前正在做一个项目,这个项目应该生成一个有向图,其中每个顶点都是一个深度嵌套的列表. 要启动该过程,需要一个深度嵌套的列表,然后应该复制和修改该列表. 例如:

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)))

推荐答案

我想我已经找到了一个很好的低时间复杂度的工作算法.生成的值的比较稍后通过定制的eq进行,当我不再需要它们时,可以使用set来消除重复项.

我只是把我的算法贴在这里,以防将来有人遇到同样的问题.

for i in range(depth + 1):
    binaryAddr = itertools.product([0, 1], repeat=i)
    for addr in binaryAddr:
        child = numpy.copy(parent)
        child[addr] = numpy.zeros_like(child[addr])
        yield child

一个简单的解释:由于我的嵌套列表的组成,我可以使用二进制地址来寻址每个值.Numpy提供了将列表作为元素地址提供的可能性,因此我只将所有必要的地址作为列表生成,并在特定地址修改父地址的副本.通过使用zeros_like将值设置为0并保持 struct 不变.

Python相关问答推荐

为什么自定义pytree aux_data对于jnp.数组来说在.jit()之后跟踪,而对于np.数组来说则不是?

OdooElectron 商务产品详情页面中add_qty参数动态更新

删除pandas rame时间序列列中未更改的值

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

Pandas :多索引组

优化在numpy数组中非零值周围创建缓冲区的函数的性能

仿制药的类型铸造

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

将数据框架与导入的Excel文件一起使用

为什么符号没有按顺序添加?

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

Python库:可选地支持numpy类型,而不依赖于numpy

Telethon加入私有频道

我对我应该做什么以及我如何做感到困惑'

如何使用Python以编程方式判断和检索Angular网站的动态内容?

关于Python异步编程的问题和使用await/await def关键字

如何从列表框中 Select 而不出错?

如何在达到end_time时自动将状态字段从1更改为0

matplotlib图中的复杂箭头形状

在matplotlib中使用不同大小的标记顶部添加批注