gpt4 book ai didi

python - 修改 Python 矩阵算法中的列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:53 24 4
gpt4 key购买 nike

我正在通过一些算法挑战来获得更多 Python 练习。我遇到了一些问题,需要更改 python 矩阵(列表列表)中的值。

# Challenge
# After they became famous, the CodeBots all decided to move to a new building and live together. The building is represented by a
# rectangular matrix of rooms. Each cell in the matrix contains an integer that represents the price of the room. Some rooms are
# free (their cost is 0), but that's probably because they are haunted, so all the bots are afraid of them. That is why any room
# that is free or is located anywhere below a free room in the same column is not considered suitable for the bots to live in.
# ex: matrix = [[0, 1, 1, 2], [[x, 1, 1, 2],
# [0, 5, 0, 0], --> [x, 5, x, x], --> 5 + 1 + 1 + 2 = 9
# [2, 0, 3, 3]] [x, x, x, x]]

我的方法有两个:1) 首先找到矩阵中的所有零并将该值替换为“x”。 2)一旦发生这种情况,遍历所有列表并找到现有“x”的索引,然后使用该索引值并在其他列表中搜索它..如果该数字“低于”,则将数值替换为“x” ' 现有的 'x'.. 希望这是有道理的。我已经完成了第一部分,我已经尝试了多种不同的方式来尝试第二部分,但现在遇到了一个错误……我觉得我已经很接近了。我也觉得我的代码效率很低(我是 Python 的新手),所以如果有更有效的方法,请告诉我。

我明白这个错误是什么意思,但我很难在得到正确答案的同时修复它。错误是索引超出范围。

我的代码:

def matrixElementsSum(matrix):
numList = len(matrix) # essentially the number of 'rows' -> number of lists
numCol = len(matrix[0]) # number of values in each list

# replace 0's in each list with 'x'
for x in matrix:
if x.count(0) > 0:
for index, i in enumerate(x):
if i == 0:
x[index] = 'x'

for x in matrix:
for y in matrix[x]:
if(matrix[x][y] == 'x'):
x_ind = y
for z in matrix:
if(z < x):
matrix[z][x_ind] = 'x'
print(matrix)

测试场景:

matrixElementsSum([[0, 1, 1, 2], 
[0, 5, 0, 0],
[2, 0, 3, 3]])

最佳答案

您仍然需要以某种方式嵌套 for 循环,因为您正在遍历列表的列表,但您可以使用列表理解来稍微简化逻辑。

def solver(matrix):
mx = [[v if v else 'x' for v in row] for row in matrix]
mxx = [[v1 if v2 else 'x' for v1, v2 in zip(row1, row2)] for row1, row2 in zip(mx[1:], matrix)]
return mx[:1] + mxx

我首先遍历矩阵,并在新矩阵 mx 中用 “x” 替换“0”。

mx = [[v if v else 'x' for v in row] for row in matrix]

这只是一个嵌套列表理解,我们对每行的每个元素、每个矩阵的每一行进行操作。 ... if ... else ... 只是您的经典三元运算符。如果 v 成立(在我们的例子中不为零),则它计算为“if”之前的值,否则它计算为“else”之后的值 - 在本例中为 ' x'.

然后我重复这个过程,但是将行偏移一个,这样我就可以检查上面的元素现在是否是 "x"

mxx = [[v1 if v2 else 'x' for v1, v2 in zip(row1, row2)] for row1, row2 in zip(mx[1:], matrix)]

这里有一点要打破。让我们从“外部”开始,逐步深入。

... for row1, row2 in zip(mx[1:], matrix)

这将压缩新矩阵,将原始矩阵偏移一个(使用 [1:] 切片表示法)。所以它返回一个在功能上等同于以下列表的可迭代对象:

[(mx_row1, matrix_row0), (mx_row2, matrix_row1), (mx_row3, matrix_row2), ...]

这允许我们同时提取给定行它上面的行,如row1row2。然后另一半-

[v1 if v2 else 'x' for v1, v2 in zip(row1, row2)]

- 对每行的每个元素重复类似的过程,而不是每个矩阵的行。我们不会像偏移 mx 矩阵的行那样偏移任何一行中的元素,但其他逻辑是相同的。然后,我们再次与我们的三元运算符进行比较,以查看上述元素是否为 0,如果是,则求值为 'x'。我们可以很容易地更改它,将 mx 的每一行的每个元素与 'x' 而不是 matrix0,但我决定反射(reflect)第一个列表理解。

一旦我有了这个新矩阵 mxx,我就简单地在 mx 的第一行前面添加,因为我们在偏移比较时有效地跳过了该行。结果是一个矩阵,其中所有 0 和下面的元素都替换为 “x”


根据评论中的说明,如果上述元素任何0,如果您希望标记一个“x”,不仅仅是上面的那个,您可以通过截取矩阵的该列的一部分并使用 all() 内置函数来查看是否有 0 来完成此操作。修改后的代码

def solver(matrix):
return [[v if all(col) else 'x' for v, col in zip(row, zip(*matrix[:idx]))] for idx, row in enumerate(matrix, 1)]

关于python - 修改 Python 矩阵算法中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com