изменение списка списка, как матрица - PullRequest
1 голос
/ 04 ноября 2019

Привет, поэтому у меня есть функция, которая принимает 4 параметра, во-первых, это вложенный список, который представляет собой матрицу, а во-вторых, что является отправной точкой ex: [1,0], третья - это точка остановки ex [2,0] ипоследний параметр, который изменяет значение вложенного списка между начальной и конечной точками, например: -1. Таким образом, он изменяет что-либо с [1,0] на [2,0] на основе дельты в примере -1. ​​Таким образом, из [1,0]: [2: 0] все числа вычитаются на 1

Теперь я создал новую точку остановки и новую начальную точку вложенного списка, и я пытаюсь сделать так, чтобы цикл проходил только через начальную и конечную точки и изменял любые числа между ними. Например, update_elevation (THREE_BY_THREE, [1, 0], [1, 1], -2) до [[1, 2, 1], [2, 4, 5], [7, 8, 9]]застрял при добавлении дельты в новый список

Пример

>>> THREE_BY_THREE_COPY = [[1, 2, 1],[4, 6, 5],[7, 8, 9]]
>>> update_elevation(THREE_BY_THREE_COPY, [1, 0], [1, 1], -2)
>>> THREE_BY_THREE_COPY
[[1, 2, 1], [2, 4, 5], [7, 8, 9]]

def update_elevation(elevation_map, start, stop, delta) -> None:

    new_start = elevation_map[start[0]][start[1]]
    new_stop = elevation_map[stop[0]][stop[1]]
    for num in range(new_start, new_stop):
        num += delta

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Чтобы просто использовать циклы, вы можете использовать следующий пример:

def update_elevation(elevation_map, start, stop, delta):

    for i in range(start[0], stop[0]+1):
        for j in range(start[1], stop[1]+1):
            elevation_map[i][j] += delta
1 голос
/ 04 ноября 2019

Для числового материала, numpy - это обычно путь. Мы можем легко индексировать между запуском и остановкой с помощью arrays, что значительно упростит код:)

import numpy as np

def update_elevation(elevation_map, start, stop, delta):
    elevation_map = np.array(elevation_map)
    elevation_map[start[0]:stop[0] + 1, start[1]:stop[1] + 1] += delta
    return elevation_map


THREE_BY_THREE_COPY = [[1, 2, 1],
                       [4, 6, 5],
                       [7, 8, 9]]

print(update_elevation(THREE_BY_THREE_COPY, [1, 0], [1, 1], -2))

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

edit Решение без numpy:

def update_elevation(elevation_map, start, stop, delta):
    for xval in range(start[0], stop[0] + 1):
        for yval in range(start[1], stop[1] + 1):
            elevation_map[xval][yval] += delta
    return elevation_map
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...