Python 如何迭代二维列表的一部分

Python 如何迭代二维列表的一部分,python,Python,我只想浏览2D列表的一部分,而不是整个列表。 以下是我想做的事情: 假设用户输入坐标[1,1](因此,第1行第1列) 如果我有2D列表: [[1,3,7], [4,2,9], [13,5,6]] 然后我想遍历[1,1] 此外,如果元素位于2D列表的一角或边缘(基本上如果用户输入[0,0],),那么我只想返回[0,0],[0,1],[1,0]和[1,1]处的元素 所以本质上我只需要在2D数组中某个点的某个特定点附近的元素 以下是我迄今为止所做的工作: 我这样做是为了在代码的开头分配4个变量:开始

我只想浏览2D列表的一部分,而不是整个列表。 以下是我想做的事情: 假设用户输入坐标
[1,1]
(因此,第1行第1列) 如果我有2D列表:

[[1,3,7],
[4,2,9],
[13,5,6]]
然后我想遍历
[1,1]

此外,如果元素位于2D列表的一角或边缘(基本上如果用户输入
[0,0],
),那么我只想返回
[0,0]
[0,1]
[1,0]
[1,1]
处的元素

所以本质上我只需要在2D数组中某个点的某个特定点附近的元素

以下是我迄今为止所做的工作: 我这样做是为了在代码的开头分配4个变量:
开始行
结束行
开始列
,和
结束列
。这些变量是根据用户想要输入的坐标分配的值(如果行是0或len(列表),则for循环相应地运行。列也是如此)。 然后,我使用嵌套for循环遍历每个元素

for row in range(row_start, row_end+1):
        for column in range(column_start, column_end+1):
            print(lst[row,column])            

唯一的问题是,它似乎工作不正常,当输入超过3x3个元素的列表大小时,通常会输出整个2D列表(所有列表都是方形列表)

您可以根据给定的行和列对列表进行切片。对于下界,使用
max
0
避免使用负索引进行切片,但对于上界则不是这样,因为切片的停止索引可以超出列表的范围:

def get_adjacent_items(matrix, row, col):
    output = []
    for r in matrix[max(row - 1, 0): row + 2]:
        for i in r[max(col - 1, 0): col + 2]:
            output.append(i)
    return output
或者,通过列表理解:

def get_adjacent_items(matrix, row, col):
    return [i for r in matrix[max(row - 1, 0): row + 2] for i in r[max(col - 1, 0): col + 2]]
因此,鉴于:

m = [[1, 3, 7],
     [4, 2, 9],
     [13, 5, 6]]
获取相邻项(m、0、0)
返回:
[1、3、4、2]

获取相邻项目(m、1、1)
返回:
[1、3、7、4、2、9、13、5、6]

获取相邻项(m、2、1)
返回:
[4、2、9、13、5、6]


获取相邻的\u项(m,2,2)
返回:
[2,9,5,6]

对于标准列表,您必须使用
lst[row][column]
而不是
lst[row,column]
使用
range()
和更高版本的
lst[row][column]
可以获取超出范围的错误
索引。更好的切片列表-
rows=lst[(第1行):(第2行)]
。即使您使用了错误的索引,也不会出现错误-而且您不必检查是否在
[0][0]
中。此外,您还可以使用NumPy数组和垂直切片Hmm。它确实有效。那很有趣。我以前从未在…
循环中见过r的
I。我猜您是在冒号后面的行和列中添加了2,因为每行/列中的最后一个元素将是元素本身后面的1(它是独占的,所以我们使用+2而不是+1)。如果我错了,请纠正我。这可以不写在一行中吗(我不想要答案,也许只是一个提示)。是的,关于为什么需要将2添加到切片的停止索引(它是独占的),您是对的。我已经用嵌套的
for
循环更新了我的答案。