Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这个切片会抛出索引器?_Python_List - Fatal编程技术网

Python 为什么这个切片会抛出索引器?

Python 为什么这个切片会抛出索引器?,python,list,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+s

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

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]
            (...)
搜索单词

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']]
它将索引器:列表索引抛出到切片的范围之外。我不明白为什么,因为[I,I+size-1]=[1,2]在列表范围[0,4]内。

在测线=图[I:I+size][j]中,您没有在[I:I+size]上得到索引错误,但是在[j]上得到了索引错误。切片后,图[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)
然后使用[…,…]代替[…][…]:

但这实际上不允许从矩阵中提取对角线,这似乎是找到单词所需要的,假设这就是你想要的。为此,您可以再次使用列表理解,并将其与enumerate组合,以获得当前字母的位置,并相应地对其进行偏移:

test = [line[j-c] for c, line in enumerate(diagram[i:(i+size)])]
# ['h', 'i']
在测线=图[i:i+size][j]中,您不会在[i:i+size]上得到索引错误,而是在[j]上得到索引错误。切片后,图[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)
然后使用[…,…]代替[…][…]:

但这实际上不允许从矩阵中提取对角线,这似乎是找到单词所需要的,假设这就是你想要的。为此,您可以再次使用列表理解,并将其与enumerate组合,以获得当前字母的位置,并相应地对其进行偏移:

test = [line[j-c] for c, line in enumerate(diagram[i:(i+size)])]
# ['h', 'i']

特别是因为你在切片。首先,认识到你拥有的不一定是矩阵;这是一个恰好包含列表的列表。当我们对一个列表进行切片时,我们会得到该列表一部分的副本

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

在这里,您已经提取了部分i:i+图的大小;这看起来像['x',x',h',x'],['x',i',x',x']。您的第二个索引现在在第一个轴(而不是第二个轴)上的偏移和受限空间中运行,因此在本例中,索引2及以上无效。即使它成功了,也会产生一整行,而不是一个字符

这是因为你在切片。首先,认识到你拥有的不一定是矩阵;这是一个恰好包含列表的列表。当我们对一个列表进行切片时,我们会得到该列表一部分的副本

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

在这里,您已经提取了部分i:i+图的大小;这看起来像['x',x',h',x'],['x',i',x',x']。您的第二个索引现在在第一个轴(而不是第二个轴)上的偏移和受限空间中运行,因此在本例中,索引2及以上无效。即使它成功了,也会产生一整行,而不是一个字符

谢谢,我是Python新手,我认为它可能会将列表列表解释为矩阵,因此列表将被垂直切片。我现在明白了,在垂直方向上搜索单词,使用循环的老式方式更好。这在水平方向上有效,tho.@LeandroMagalhães这正是numpy所做的,请参见我答案的最后一部分。不幸的是,我正在帮助一位朋友学习这门大学课程,它不允许任何人使用自定义库,所以我必须保持第一种方式。再次非常感谢!谢谢,我是Python新手,我认为它可能会将列表列表解释为矩阵,因此列表将被垂直切片。我现在明白了,在垂直方向上搜索单词,使用循环的老式方式更好。这在水平方向上有效,tho.@LeandroMagalhães这正是numpy所做的,请参见我答案的最后一部分。不幸的是,我正在帮助一位朋友学习这门大学课程,它不允许任何人使用自定义库,所以我必须保持第一种方式。再次非常感谢!FWIW,切片索引从不引发索引器。例如,[1,2,3][1:100]给出了[2,3]FWIW,切片索引从不产生索引器。例如,[1,2,3][1:100]给出[2,3]