逐一更改2D数组中的零,然后将所得数组放入Python中的另一个数组中

问题描述 投票:0回答:1

我正在努力实现以下目标。我有一个2D数组,其尺寸为4x4。我想获得所有可能性,在这里我可以插入单个1而不是零,然后返回一个包含所有这些可能性的数组

所以,如果我们采取:

[[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

将导致:

[[1, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
...

由于输入数组中有14个零,因此结果数组中总共有14个条目。

问题是,据我所知,我当前的代码[[应该可以正常工作,但是我似乎无法弄清出错的地方。

def getPossibilities(arr): p = [] for i in range(4): for j in range(4): if arr[i][j] == 0: p.append(arr) p[-1][i][j]=1 return p for i in getPossibilities([[0,1,0,0],[0,0,1,0],[0,0,0,0],[0,0,0,0]]): print(i)
这将产生14个实心阵列。

我包括检查结果的方式,以防出现错误。我还尝试过先将arr数组复制到一个临时数组中,然后进行更改,但无济于事。

这里出了什么问题?我似乎找不到答案。此外,是否有更优雅,更快捷的方式来执行此操作?这对我的用例真的很有益。

非常感谢!

python arrays loops multidimensional-array append
1个回答
0
投票
这有些棘手,但是由于您有列表列表,因此该副本将无法工作,并且每次都将更改数组,因此您需要的是Deepcopy:

import copy def getPossibilities(arr): p = [] for i in range(4): for j in range(4): if arr[i][j] == 0: tmp = copy.deepcopy(arr) tmp[i][j]=1 p.append(tmp) return p for i in getPossibilities([[0,1,0,0],[0,0,1,0],[0,0,0,0],[0,0,0,0]]): print(i) [[1, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [1, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [0, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [1, 0, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 1, 0, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0]] [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 1]]

© www.soinside.com 2019 - 2024. All rights reserved.