Рекурсивно найти смежные координаты для n-мерного массива - PullRequest
2 голосов
/ 11 марта 2020

Для любого набора координат, который мне дан (например, (2,2) или (1,2,3) или (4,5,6,7,8) и т. Д. c.), Как я могу получить список всех смежных координат.
, чтобы

find_adjacents((2,2))    

  >>[[1,1],[1,2],[1,3],[2,1],[2,3],[3,1],[3,2],[3,3]]  

и

find_adjacents((2,2,2,2))

would return something with 3^4-1 elements

Для этого можно игнорировать крайние значения (представьте, что индексы варьируются от -inf до inf )

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Для этого вы можете использовать itertools.product. Декартово произведение диапазонов будет включать в себя сам вход, поэтому нам нужно удалить его позже. list.pop работает для этого, потому что продукт генерируется по порядку, так что сам вход всегда будет точно средним элементом.

from itertools import product

def neighbours(t):
    ranges = [(x-1, x, x+1) for x in t]
    result = list(product(*ranges))
    result.pop(len(result) // 2)
    return result

Примеры (отформатированы для удобства чтения):

>>> neighbours( (1, 2) )
[(0, 1), (0, 2), (0, 3),
 (1, 1),         (1, 3),
 (2, 1), (2, 2), (2, 3)]

>>> neighbours( (1, 1, 1) )
[(0, 0, 0), (0, 0, 1), (0, 0, 2),
 (0, 1, 0), (0, 1, 1), (0, 1, 2),
 (0, 2, 0), (0, 2, 1), (0, 2, 2),

 (1, 0, 0), (1, 0, 1), (1, 0, 2),
 (1, 1, 0),            (1, 1, 2),
 (1, 2, 0), (1, 2, 1), (1, 2, 2),

 (2, 0, 0), (2, 0, 1), (2, 0, 2),
 (2, 1, 0), (2, 1, 1), (2, 1, 2),
 (2, 2, 0), (2, 2, 1), (2, 2, 2)]
1 голос
/ 11 марта 2020

Вы можете использовать рекурсию:

def combos(d, c = []):
  if not d:
     yield c
  else:
     yield from [i for b in range(d[0]-1, d[0]+2) for i in combos(d[1:], c+[b])]

vals = (2,2)
print(list(combos(vals)))
print(list(combos((1, 1, 1))))

Вывод:

[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 2, 0], [0, 2, 1], [0, 2, 2], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 2, 0], [1, 2, 1], [1, 2, 2], [2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 2, 0], [2, 2, 1], [2, 2, 2]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...