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

标签 python python-3.x list list-comprehension

最终,我想使用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/

相关文章:

python - 在python中为 Pandas 数据框获取时间索引

python - while 循环阻塞异步任务

python - 使用列表中的值过滤字典中的键、值

Java:列表插入多个具有相同哈希值的对象

python - 如何在 python 中使用 xlsxwriter 卡住 excel 文件中的行和列

python - 从检查点恢复时,如何更改参数的数据类型?

python - 我有 4 个嵌套的 div 标签,当我使用 find_all 打印文本时,它打印文本 4 次

python-3.x - PyTorch 和 CUDA 驱动程序

python - 检查函数是否属于一个类

c# - 选择不同于 List<t> 忽略一个元素