Python 递归查找n维数组的相邻坐标
对于给定的任何坐标元组(例如(2,2)或(1,2,3)或(4,5,6,7,8)等),如何获得所有相邻坐标的列表。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适用于此,因为产品是按顺序生成的,因此输入本身始终恰好
所以,
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]]