Pythonic способ сравнения всех смежных значений в списке списков? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть список списков

a = [[0, 1, 2, 3,],
     [4, 5, 6, 7,],
     [8, 9, 10, 11],
     [12, 13, 14, 15]]

Для некоторых a[i][j] есть ли способ получить вокруг него 8 значений без указания a[i-1][j-1], a[i][j-1], ... , a[i+1][j+1]? Если нет, то есть ли, по крайней мере, способ справиться с делами на грани, не проверяя, на грани я или нет?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Скажем, n - это количество строк, а m - это число столбцов.

Во-первых, когда i и j будут действительными? Если 0 <= i < n и 0 <= j < m, это действительно.

#Code to check if i and j are valid
def is_valid(i, j, n, m):
    if 0 <= i < n and 0 <= j < m:
        return True

    return False

Чтобы получить смежные значения, вы должны найти все возможные комбинации, где вы ничего не можете сделать, добавить 1 или вычесть 1 к обоим iи j. Но если вы ничего не сделаете с i и j, это даст вам текущий элемент, который нам не нужен.

#Code to get the adjacent values
def get_adjacent(a, i, j, n, m):
    l = []

    for x in [-1, 0, 1]:
        for y in [-1, 0, 1]:
            if not (x == y == 0) and is_valid(i+x, j+y, n, m):
                l.append(a[i+x][j+y])

    return l

Надеюсь, это помогло!

0 голосов
/ 08 ноября 2019

Я нашел следующее решение, которое заботится о крайних случаях. Не уверен, что есть более питонический путь.

a = [[0, 1, 2, 3,],
     [4, 5, 6, 7,],
     [8, 9, 10, 11],
     [12, 13, 14, 15]]

def print_edge_values(outer_idx, outer_len, inner_idx, inner_len):
    print("sorrounding values: "),
    for i in range(max(0, outer_idx-1), min(outer_idx+2, outer_len)):
        for j  in range(max(0, inner_idx-1), min(inner_idx+2, inner_len)):
            if((i,j) != (outer_idx, inner_idx)):
                print((i, j), "=", a[i][j], " "),
    print("")


for idx, item in enumerate(a):
    print(idx,":", item)
    for idx2, i in enumerate(item):
        print("value(%d, %d)= %d" % (idx, idx2, a[idx][idx2]))
        print_edge_values(idx, len(a), idx2, len(item))
0 голосов
/ 08 ноября 2019

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

def foo(a):
    for r_i in range(len(a)):
        for i in range(len(a[0])):
            values = []
            if r_i > 0:
                values.extend(a[r_i - 1][max(0, i - 1):i + 2])
            values.extend(a[r_i][max(0, i - 1):i + 2])
            if r_i < len(a) - 1:
                values.extend(a[r_i + 1][max(0, i - 1):i + 2])
            print(values)  # do stuff with `values`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...