从列表的Python列表中查找连续位置

从列表的Python列表中查找连续位置,python,list,Python,List,我有一个包含3个列表的列表 地点=[(1,1),(3,3),(6,7)],[(5,2),(3,4),(2,3)],[(3,7),(3,5),(7,7)]] 第一个列表包含字母A的位置 第二个列表包含字母B的位置 第三个列表包含字母C的位置 我的任务是找到他们在一起,他们坐得很近。这是一个字谜问题。所以,字母B可以坐在A的上、下、右或左。C的方向必须和B到A的方向相同 在这种情况下,解决方案将是一个带有位置的新列表。答案是- 谜题解决位置=[(3,3)、(3,4)、(3,5)] 我正在考虑使用嵌

我有一个包含3个列表的列表

地点=[(1,1),(3,3),(6,7)],[(5,2),(3,4),(2,3)],[(3,7),(3,5),(7,7)]]

第一个列表包含字母A的位置

第二个列表包含字母B的位置

第三个列表包含字母C的位置

我的任务是找到他们在一起,他们坐得很近。这是一个字谜问题。所以,字母B可以坐在A的上、下、右或左。C的方向必须和B到A的方向相同

在这种情况下,解决方案将是一个带有位置的新列表。答案是-

谜题解决位置=[(3,3)、(3,4)、(3,5)]

我正在考虑使用嵌套列表。但如果给一些单词加上10或15个字母,就会出现一些问题。我需要一个程序,将解决任何字谜与任何字母数

目前,我正在尝试一个嵌套循环,但它对较长的单词不起作用,每次都需要为新单词编辑代码。代码如下所示-

A= [(1,1), (3,3), (6,7)]
B= [(5,2), (3,4), (2,3)]
C= [(3,7), (3,5), (7,7)]


for row_A,column_A in A:
    for row_B,column_B in B:
        if (row_A+1==row_B or row_A-1==row_B or row_A==row_B)
 and (column_A+1==column_B or column_A-1 ==column_B or column_A==column_B):
            for row_C,column_C in C:
                x_co, y_co = row_B-row_A, column_B-column_A
                if row_B+x_co ==row_C and column_B+y_co ==column_C:
                    print (row_A, column_A, row_B, column_B, row_C, column_C)
结果给出了已解决难题的位置

>> 3 3 3 4 3 5

没有为每个字母表编写if语句,还有其他方法吗?

您可以使用列表理解来迭代4个可能的方向和可能的起点(a的),以查看哪些方向会导致在其余位置找到对应的点:

[[(ax + dx * i, ay + dy * i) for i in range(len(locations))] for dx, dy in ((1, 0), (0, 1), (-1, 0), (0, -1)) for ax, ay in locations[0] if all((ax + dx * i, ay + dy * i) in c for i, c in enumerate(locations[1:], 1))]
这将返回:

[[(3, 3), (3, 4), (3, 5)]]

请注意,这将返回元组列表,因为可能存在多个解决方案。

您必须编写一些代码。或者你希望我们做这项工作吗?作为一个简单的解决方案,我会生成一个字符串列表,即
[“…”、“.a…”、“…ABC.C”…
等,并在其中搜索可能的解决方案(即
ABC
CBA
),然后你可以
zip
列表(经过一点操作)找到垂直解决方案。@KlausD。现在添加了代码。这是一个大问题解决方案的一小部分。我应该早点添加代码和当前的方法。它工作起来很有魅力。非常感谢。若值大得多怎么办?比如(这是图像中每个字母中心的x和y值)位置=[[(23271),(23396),(23520),(64147)],[(23313),(23220),(105562),(14722)],[(23354),(64520),(147437),(23370)]在这种情况下,两个连续字母的中心在x或y值上的差异=大于35且小于60