【问题标题】:Find neighbors of a given position [closed]查找给定位置的邻居[关闭]
【发布时间】:2021-03-22 01:47:32
【问题描述】:

我有一个像 [(4,6),(0,3),(7,9)] 这样的元组列表,它位于一个 8 行 10 列的矩阵中。我想找到元组的邻居位置。

例如,我希望:

Neighbors (4, 6): (3, 6) (4, 5) (4, 7) (5, 6)
Neighbors (0, 3): (0, 2) (0, 4) (1, 3)
Neighbors (7, 9): (6, 9) (7, 8)

邻居位置必须在矩阵中。

我尝试将元组列表转换为列表列表,但我坚持创建一个循环来查找这些邻居。

l = [(4,6),(0,3),(7,9)]
lst = []
rows = 8
columns = 10
for i in l:
    lst.append(list(i))

【问题讨论】:

  • 请通过intro tourhelp centerhow to ask a good question 了解本网站的运作方式并帮助您改进当前和未来的问题,从而帮助您获得更好的答案。 “告诉我如何解决这个编码问题?”与 Stack Overflow 无关。您必须诚实地尝试解决方案,然后就您的实施提出具体问题。 Stack Overflow 无意取代现有的教程和文档。
  • 首先,找到一个网格点的邻居是一个很好的技术。见How much researchQuestion Checklist
  • 第二,虽然您清楚地知道如何自己找到邻居,但您并没有尝试编写代码。我们希望您在此处发布之前进行此尝试。

标签: python list loops


【解决方案1】:

根本不需要将元组转换为列表。

编写一个函数来返回单个点的邻居(该函数应该遍历所有可能的邻居,然后将结果过滤到矩阵边界内的那些),然后在另一个循环中使用该函数获取所有点的邻居。

>>> from typing import List, Tuple
>>> def neighbors(coords: Tuple[int, int], rows: int, cols: int) -> List[Tuple[int, int]]:
...     y, x = coords
...     return [
...         (y + dy, x + dx)
...         for dy, dx in [(0, 1), (1, 0), (-1, 0), (0, -1)]
...         if y + dy in range(rows) and x + dx in range(cols)
...     ]
...
>>> neighbors((7, 9), 8, 10)
[(6, 9), (7, 8)]
>>> [n for p in [(4, 6), (0, 3), (7, 9)] for n in neighbors(p, 8, 10)]
[(4, 7), (5, 6), (3, 6), (4, 5), (0, 4), (1, 3), (0, 2), (6, 9), (7, 8)]

【讨论】:

    【解决方案2】:

    您可以像列表一样读取元组,所以不妨试试这个?

    l = [(4,6),(0,3),(7,9)]
    lst = []
    for i in range(len(l)):
        x = l[i][0]
        y = l[i][1]
        if x - 1 >= 0:
            lst.append((x - 1, y))
        if x + 1 <= 7:
            lst.append((x + 1, y))
        if y - 1 >= 0:
            lst.append((x, y - 1))
        if y + 1 <= 9:
            lst.append((x, y + 1))
    

    然后,您可以在每次迭代后将这些值保存到任何您想要的位置。 希望这会有所帮助

    【讨论】:

    • 我认为你应该遍历range(len(l)) 而不是l。你的代码抛出TypeError
    • 谢谢!感谢帮助
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多