Python 递归查找n维数组的相邻坐标

Python 递归查找n维数组的相邻坐标,python,list,recursion,tuples,Python,List,Recursion,Tuples,对于给定的任何坐标元组(例如(2,2)或(1,2,3)或(4,5,6,7,8)等),如何获得所有相邻坐标的列表。 所以, find_adjacents((2,2)) >>[[1,1],[1,2],[1,3],[2,1],[2,3],[3,1],[3,2],[3,3]] 及 您可以对此忽略边缘情况(想象索引范围从-inf到inf)您可以用于此。范围的笛卡尔积将包括输入本身,因此我们需要在之后删除它list.pop适用于此,因为产品是按顺序生成的,因此输入本身始终恰好

对于给定的任何坐标元组(例如(2,2)或(1,2,3)或(4,5,6,7,8)等),如何获得所有相邻坐标的列表。
所以,

find_adjacents((2,2))    

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

您可以对此忽略边缘情况(想象索引范围从-inf到inf)

您可以用于此。范围的笛卡尔积将包括输入本身,因此我们需要在之后删除它
list.pop
适用于此,因为产品是按顺序生成的,因此输入本身始终恰好是中间元素

来自itertools导入产品的

def(t):
范围=[(x-1,x,x+1)表示t中的x]
结果=列表(产品(*范围))
result.pop(len(result)//2)
返回结果
示例(为可读性而格式化):

邻居((1,2)) [(0, 1), (0, 2), (0, 3), (1, 1), (1, 3), (2, 1), (2, 2), (2, 3)] >>>邻居((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)] 您可以使用递归:

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]]

“所有相邻坐标”模糊;你到底是什么意思?为什么这是预期产出?你为什么要递归地这样做?对不起。我指的是每个指定坐标元素(包括“角”)中有1个元素的任何东西。(1,1,1)的角相邻元素是00020000202020002002202222。我明白了,但不包括输入本身?是的。因此,它将始终是3^4-1个元素,而不是3^4个元素
[[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]]