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

时间:2019-02-11 02:37:16

标签: python list

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

位置= [[(1,1),(3,3),(6,7)],[(5,2),(3,4),(2,3)],[(3, 7),(3,5),(7,7)]]

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

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

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

puzzle image

我的任务是在它们彼此靠近的地方找到它们。这是一个难题的问题。因此,字母B可以坐在A的上,下,右或左。C的方向必须与B到A的方向相同。

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

puzzle_solved_location = [(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语句吗?

1 个答案:

答案 0 :(得分:1)

您可以使用列表推导来遍历4个可能的方向和可能的起点(A的起点),以查看哪些方向会导致在其余位置中找到相应的点:< / p>

[[(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)]]

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