【问题标题】:How to use list comprehension to create list from a "diagonal" range in a list of lists?如何使用列表推导从列表列表中的“对角线”范围创建列表?
【发布时间】:2018-11-07 03:21:25
【问题描述】:

最终,我想使用 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 的类似标签的问题,但找不到使用列表理解同时跨越两个索引的人,如果我错过了,请道歉。

【问题讨论】:

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


    【解决方案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)])
    

    【讨论】:

    • 啊!当然,我不知道为什么我没有想过在列表理解的索引中使用可迭代对象,尤其是考虑到我在 for 循环中所做的事情!非常感谢。而且,顺便说一句,在我的完整代码中,我确实考虑了可能想要访问坏索引的对角线,不过要指出这一点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2017-02-17
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多