如何使用列表理解从列表的“对角”范围创建列表?

时间:2018-11-07 03:21:25

标签: 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() some 个元素,以对角线的方式选择它们。因此,对于这个示例,我想经过长度为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上查看了类似标签的问题,但找不到我使用列表理解功能一次穿越两个索引的人,如果我错过了,则表示歉意。

1 个答案:

答案 0 :(得分:1)

您可以使用列表推导沿矩阵的任何对角线创建项目列表,并输入行和列索引以及对角线的长度。然后使用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)])