Почему эта нарезка бросает IndexError?

1

Мой код для поиска слов на диаграмме выглядит следующим образом:

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].

Теги:
list

2 ответа

2
Лучший ответ

В строке 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']
  • 0
    Спасибо, я новичок в Python и подумал, что он может интерпретировать список списков как матрицу, поэтому списки будут разрезаны по вертикали. Теперь я понимаю, что для поиска слов по вертикали лучше старомодным способом (с использованием циклов). Это работает по горизонтали, хотя.
  • 0
    @ LeandroMagalhães Это именно то , что numpy делает, увидеть последнюю часть моего ответа.
Показать ещё 2 комментария
2

Это особенно потому, что вы нарезаете. Во-первых, поймите, что то, что у вас есть, не обязательно является матрицей; это список, который содержит списки. Когда мы нарезаем список, мы получаем копию части этого списка.

test = diagram[i:(i+size)][j]

Итак, здесь вы извлекли часть i:i+size diagram; это выглядит как [['x', 'x', 'h', 'x'], ['x', 'i', 'x', 'x']]. Ваша вторая индексация теперь работает в смещенном и ограниченном пространстве на первой оси, а не на второй оси, поэтому в этом примере индексы 2 и выше являются недопустимыми. Даже если это сработает, это создаст целую строку, а не один символ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню