gpt4 book ai didi

python - 如何使用列表理解从列表列表中的 "diagonal"范围创建列表?

转载 作者:行者123 更新时间:2023-12-01 08:49:29 24 4
gpt4 key购买 nike

最终,我想使用reduce并找到一个产品。我知道如何使用 for 循环来执行这个问题,但我知道列表理解更快,而且通常更“Pythonic”,所以我尽最大努力理解如何在列表理解中进行我想要的移动。

这是一个例子:

grid = [[a, b, c, d]
[e, f, g, h]
[i, j, k, l]
[m, n, o, p]
[q, r, s, t]] # All the sublists are integer lists.

所以最终我想做的是reduce()这些子列表的一些元素,以对角线方式选择它们。因此,在这个例子中,我想遍历长度为 3 的右下对角线。如果我从 [0][0] 开始,我的列表理解将通过 [a, f, k]。这是我迄今为止尝试过的一些代码:

diag_len = 3
i = 0
j = 0
# Purposely omitting the reduce() part of this next line
desired_list = grid[i:i + diag_len][j:j + diag_len]

实际上,上面的代码采用 grid 中索引 0、1 和 2 的整个子列表,而不仅仅是所需对角线中的三个元素。我当前的解决方案的 for 等效项如下所示:

for z in range(diag_len):
desired_list.append(num_grid[i + z][j + z])
desired_product *= desired_list[z]

我查看了 SO 上类似标记的问题,但找不到任何人使用列表理解同时跨越两个索引,如果我错过了,抱歉。

最佳答案

您可以使用列表理解沿着矩阵中的任何对角线创建项目列表,并输入行索引和列索引以及对角线的长度。然后使用 reduce() 获取结果列表中整数的乘积。

例如(您可能希望对函数进行更多保护,以防止输入值超出范围而导致错误,但这应该可以帮助您入门):

from functools import reduce

grid = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20]]

def get_diagonal(row, column, length):
return [grid[row + i][column + i] for i in range(length)]

diag_list = get_diagonal(2, 1, 3)
diag_prod = reduce(lambda a, b: a * b, diag_list)

print(diag_list)
print(diag_prod)
# OUTPUT
# [10, 15, 20]
# 3000

如果您最终尝试组合成一个函数,您可以这样做:

def get_diagonal_product(row, column, length):
return reduce(lambda a, b: a * b, [grid[row + i][column + i] for i in range(length)])

关于python - 如何使用列表理解从列表列表中的 "diagonal"范围创建列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53183156/

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