为什么这个切片抛出IndexError?

时间:2018-06-16 08:51:35

标签: python list

我在图表上搜索单词的代码如下:

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 index超出范围。我无法理解为什么,因为[i,(i + size-1)] = [1,2]在列表边界内[0,4]。

2 个答案:

答案 0 :(得分:2)

test = diagram[i:(i+size)][j]行中,您不会在[i:(i+size)]上获得索引错误,而是在[j]上。切片后,diagram[i:(i+size)]是两个列表的列表,j2,因此 索引超出范围。

另请注意,[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']

答案 1 :(得分:2)

具体是因为你正在切片。首先,要意识到你拥有的东西不一定是矩阵;它是一个恰好拥有列表的列表。当我们对列表进行切片时,我们会得到该列表的一部分副本。

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

所以在这里你已经提取了i:i+size的{​​{1}}部分;这看起来像diagram。您的第二个索引现在在第一个轴上的偏移和受限空间中操作,而不是在第二个轴上操作,因此在此示例中,索引[['x', 'x', 'h', 'x'], ['x', 'i', 'x', 'x']]及更高版本无效。即使它成功了,它也会产生一整行,而不是一个字符。