寻找x-y坐标

时间:2019-09-25 17:49:30

标签: python python-3.x

我正在尝试搜索单词。到目前为止,我现在可以找到给定网格中所有单词的方向。现在我的问题是如何仅找到第一个字母的x-y坐标。

我在这里有一段代码:

words=['hello','hola','hella','heya','heyo','hill','halo','hall','hail','hay','hale','holy']
rows= ['eahaehh','allehoh','gohloau','rhelloy','iayoyiu','iiaelah','hlhallo']
row_length=len(rows[0])
column_length=len(rows)

for row_number, row in enumerate(rows):
    final_word = next((word for word in words if word in row), None)
    if final_word:
        print(f"{final_word} right")

for row_number, row in enumerate(rows):
    candidate = ''.join(reversed(row))
    final_word = next((word for word in words if word in candidate), None)
    if final_word:
        print(f"{final_word} left")

negative_slopes=[[rows[column_length-1-q][p-q]
        for q in range(min(p, column_length-1), max(0, p-row_length+1)-1, -1)]
       for p in range(column_length+row_length-1)]

positive_slopes=[[rows[p - q][q]
             for q in range(max(p-column_length+1,0), min(p+1, row_length))]
            for p in range(column_length + row_length - 1)]

for word in negative_slopes:
    candidate=''.join(word)
    final_word = next((word for word in words if word in candidate), None)
    if final_word:
        print(f"{final_word} down-right")

for word in positive_slopes:
    candidate=''.join(reversed(word))
    final_word = next((word for word in words if word in candidate), None)
    if final_word:
        print(f"{final_word} down-left")

因此,很明显,它仅显示最终单词及其方向。我尝试将for循环嵌套在每个循环中,但这基本上破坏了整个代码。因此,我尝试制作一个单独的代码,从理论上讲它会找到第一个字母的坐标,我只是不知道如何将其集成到现有代码中。这是可能的解决方案:

for row_number, row in enumerate(rows):
    for column_number, letter in enumerate(row):
        for word in words:
                if word[0]==letter: 
                    coordinates.append[column_number, row_number]

因此,我将拥有两个带有该元素的字典:

coordinates={'hello': (2, 6), 'hola': (2, 6), 'hella': (2, 6), 'heya': (2, 6), 'heyo': (2, 6), 'hill': (2, 6), 'halo': (2, 6), 'hall': (2, 6), 'hail': (2, 6), 'hay': (2, 6), 'hale': (2, 6), 'holy': (2, 6)}

solution={'hello': 'right', 'hall': 'right', 'hella': 'left', 'hale': 'left', 'hail': 'down', 'heya': 'down', 'holy': 'down', 'hola': 'up', 'hay': 'down-right', 'hill': 'up-left', 'heyo': 'up-right', 'halo': 'down-left'}

首先,这是一个好主意,但我忘记考虑到它只是从字面上找到字母并给出其坐标。如您所见,坐标是全(2,6),因为这是h第一次出现。

我希望输出为:

word (x,y) direction

我该如何解决这个问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

不再搜索该词。而是使用局部变量来保存起始位置的坐标。 如果找到了单词,则也返回该位置。

更多细节...

您的三重循环(for row_number ... for column_number ... for words)有(1)过度杀伤和(2)容易出错。只要找到字词,只需添加代码即可保存位置。例如:

for row_number, row in enumerate(rows):
    final_word = next((word for word in words if word in row), None)
    if final_word:
        print(f"{final_word} right")
        ^ YOU ARE HERE ...

...在此^点,您已经拥有row_numberindex方法将为您提供该列。

对于其他每个方向,您都可以构造一个人工的字母“行”进行搜索。这种构造是简单的线性变换。只需对索引进行反向计算,您将再次获得所需的(x, y)坐标。为此进行数学计算。例如,如果您构建了一个从(0,5)开始并沿着西南对角线向下的“行”;然后您发现您的单词从 that “行”的位置2开始;那么您如何计算该起始字母的坐标?

推导留给读者练习。 :-)