Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从二维字符数组中提取对角线作为字符串?_Python_Multidimensional Array - Fatal编程技术网

Python 如何从二维字符数组中提取对角线作为字符串?

Python 如何从二维字符数组中提取对角线作为字符串?,python,multidimensional-array,Python,Multidimensional Array,我一直在尝试以编程方式解决下面的字谜,作为自己的练习: puzzle = [ ['t', 'r', 'o', 'l', 'l'], ['u', 'u', 'a', 'a', 'y'], ['n', 'r', 'r', 'e', 'q'], ['a', 'o', 'h', 'd', 'q']] words = ["troll", "tuna", "nut", "oral", "turd", "deal", "rut", "hey", "ear"] 但是我需要一些帮

我一直在尝试以编程方式解决下面的字谜,作为自己的练习:

puzzle = [
    ['t', 'r', 'o', 'l', 'l'],
    ['u', 'u', 'a', 'a', 'y'],
    ['n', 'r', 'r', 'e', 'q'],
    ['a', 'o', 'h', 'd', 'q']]
words = ["troll", "tuna", "nut", "oral", "turd", "deal", "rut", "hey", "ear"]
但是我需要一些帮助来完成这个练习。以下是我迄今为止所做的工作:

我将行和列转换为单个字符串,并将它们放入列表中:

a = []

#Rows
for x in puzzle:
    a.append(''.join(x))
    a.append(''.join(x)[::-1])  #Append reversed string.

#Columns
for i in range(len(puzzle[0])):
    s = ""
    for j in range(len(puzzle)):
        s += puzzle[j][i]
    a.append(s)
    a.append(''.join(s)[::-1])  #Append reversed string.
所以现在我可以找到任何水平或垂直拼写的单词。正如您可能已经猜到的,下一步是遍历对角线并将其放入列表中,但无法理解这样做的逻辑。有人能帮我吗?

这样想:

  • 在行中找到的单词是序列
    puzzle[a][b+i]

  • 在列中找到的单词是序列
    puzzle[a+i][b]

  • 对角线上的单词是序列
    puzzle[a+i][b+i]
    puzzle[a+i][b-i]

  • 对于
    i=0,…,n
    ,每个值代表一些整数
    a,b,n
    ,因此生成的所有索引都在表中。您可以向前和向后检查序列。通过将约束放置在
    a、b、n
    上,可以实现附加约束,例如仅考虑完整的行。特别是,我对它的解释是,在每种情况下,您都需要尽可能长的字符串;在这种情况下,您只需将
    n
    设置为每个
    a、b
    的最大可能值


    你已经有1个了。二,。放下。我建议您从列的解决方案开始,并尝试将其应用于3中描述的序列。相反。

    首先,查看嵌套列表中所有元素的索引:

    (0,0) (0,1) (0,2) (0,3) (0,4)
    (1,0) (1,1) (1,2) (1,3) (1,4)
    (2,0) (2,1) (2,2) (2,3) (2,4)
    (3,0) (3,1) (3,2) (3,3) (3,4)
    (4,0) (4,1) (4,2) (4,3) (4,4)
    
    由此,您可以写下对角线上半部分的索引,以了解模式:

    (0,4)
    (0,3), (1,4)
    (0,2), (1,3), (2,4)
    (0,1), (1,2), (2,3), (3,4)
    (0,0), (1,1), (2,2), (3,3), (4,4)
    
    我们如何生成这些成对的列表?首先,让我们看一下外部循环。外部循环将穿过第一个子列表的顶部,即成对
    (0,j)
    ,其中
    j
    从最后一个索引开始向下计数:

    for j in range(len(puzzle), -1, -1):
        print((0, j))
    
    #output:
    (0, 4)
    (0, 3)
    (0, 2)
    (0, 1)
    (0, 0)
    
    然后,我们需要让我们的内部循环在每一步上向下和向右,并且永远不要超过列表的末尾:

    for j in range(len(puzzle), -1, -1):
        for i in range(len(puzzle)):
            j += 1
            if j > len(puzzle):
                 break
            print((i,j))
        print("")
    
    输出:

    (0, 4)
    
    (0, 3)
    (1, 4)
    
    (0, 2)
    (1, 3)
    (2, 4)
    
    (0, 1)
    (1, 2)
    (2, 3)
    (3, 4)
    
    如果将外循环从
    N..-1
    开始,则还可以得到穿过中心的对角线。然后,使用类似的逻辑得到对角线的下半部分

    要使对角线朝另一个方向移动,您可以再次使用相同的逻辑(通过查看您想要的索引,写入外循环,然后写入内循环),或者您可以反转每个子列表(可以将其视为查看镜像,或在垂直线上反射2d阵列!执行此操作时,所有对角线将以“相反”方向穿过元素)