我在图表上搜索单词的代码如下:
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]。
答案 0 :(得分: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']
答案 1 :(得分:2)
具体是因为你正在切片。首先,要意识到你拥有的东西不一定是矩阵;它是一个恰好拥有列表的列表。当我们对列表进行切片时,我们会得到该列表的一部分副本。
test = diagram[i:(i+size)][j]
所以在这里你已经提取了i:i+size
的{{1}}部分;这看起来像diagram
。您的第二个索引现在在第一个轴上的偏移和受限空间中操作,而不是在第二个轴上操作,因此在此示例中,索引[['x', 'x', 'h', 'x'], ['x', 'i', 'x', 'x']]
及更高版本无效。即使它成功了,它也会产生一整行,而不是一个字符。