Как использовать понимание списка для создания списка из «диагонального» диапазона в списке списков? - PullRequest
0 голосов
/ 07 ноября 2018

В конечном счете, я хотел бы использовать уменьшить и найти продукт. Я знаю, как выполнить эту задачу, используя циклы for, но я понимаю, что списочные понимания быстрее и, как правило, более «питонны», поэтому я изо всех сил пытаюсь понять, как сделать желаемое движение внутри понимания списка.

Итак, вот пример:

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]

Как и прежде, код выше принимает все подсписки индексов 0, 1 и 2 в grid, а не только три элемента в нужной диагонали. for эквивалент для того, что я хочу, мое текущее решение выглядит следующим образом:

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

Я посмотрел на аналогично помеченные вопросы о SO, но не смог найти никого, кто бы двигался по двум индексам одновременно, используя понимание списка, извинения, если я его пропустил.

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете использовать понимание списка, чтобы создать список элементов по любой диагонали в вашей матрице с вводом для индексов строк и столбцов вместе с длиной диагонали. А затем используйте 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)])
...