Мой код для поиска слов на диаграмме выглядит следующим образом:
size = len(word)
height = len(diagram)
width = len(diagram[0])
for i in range(0, height):
for j in range(0, width):
if (diagram[i][j] == word[0]):
if (i + size < height):
print(i, size, i+size, height)
test = diagram[i:(i+size)][j]
(...)
Печать показывает
1, 2, 3, 4
Поиск слова
hi
На следующей диаграмме:
x x x x
x x h x
x i x x
x x x x
Или в виде списка:
[['x', 'x', 'x', 'x'], ['x', 'x', 'h', 'x'], ['x', 'i', 'x', 'x'], ['x', 'x', 'x', 'x']]
Он выдает индекс IndexError: list вне диапазона нарезки. Я не могу понять, почему, поскольку [i, (i + size-1)] = [1, 2] находится внутри границ списка [0, 4].
В строке test = diagram[i:(i+size)][j]
вы не получите индексную ошибку на [i:(i+size)]
а на [j]
. После нарезки diagram[i:(i+size)]
представляет собой список из двух списков, а j
равно 2
, поэтому этот индекс выходит за пределы.
Также обратите внимание, что [j]
будет индексироваться в список списков, а не в отдельные списки, т.е. Вы получите строку, а не столбец диаграммы. Скорее всего, вам нужно составить список разделов, получая j
й элемент каждой строки:
test = [line[j] for line in diagram[i:(i+size)]]
Или вы можете использовать numpy
и его многомерную нарезку:
import numpy as np
diagram = np.array(diagram)
а затем используйте [...,...]
вместо [...][...]
:
test = diagram[i:(i+size),j]
Но это на самом деле не позволяет извлекать диагонали из матрицы, как представляется, необходимо найти слово (предполагая, что это то, что вы хотите). Для этого вы можете снова использовать понимание списка и объединить их с enumerate
чтобы получить позицию текущего письма и соответственно смещать его:
test = [line[j-c] for c, line in enumerate(diagram[i:(i+size)])]
# ['h', 'i']
Это особенно потому, что вы нарезаете. Во-первых, поймите, что то, что у вас есть, не обязательно является матрицей; это список, который содержит списки. Когда мы нарезаем список, мы получаем копию части этого списка.
test = diagram[i:(i+size)][j]
Итак, здесь вы извлекли часть i:i+size
diagram
; это выглядит как [['x', 'x', 'h', 'x'], ['x', 'i', 'x', 'x']]
. Ваша вторая индексация теперь работает в смещенном и ограниченном пространстве на первой оси, а не на второй оси, поэтому в этом примере индексы 2
и выше являются недопустимыми. Даже если это сработает, это создаст целую строку, а не один символ.
numpy
делает, увидеть последнюю часть моего ответа.