【问题标题】:How to iterate through a section of a 2D list如何遍历二维列表的一部分
【发布时间】:2019-10-26 00:21:12
【问题描述】:

我只想浏览 2D 列表的一部分,而不是全部。 这基本上就是我想做的事情: 假设用户输入坐标[1,1](所以,第 1 行第 1 列) 如果我有 2D 列表:

[[1,3,7],
[4,2,9],
[13,5,6]]

然后我想遍历与[1,1]处的元素相邻的所有元素

此外,如果元素位于二维列表的角落或边缘,(例如,基本上如果用户输入[0,0],),那么我只想取回[0,0] 处的元素,@ 987654327@、[1,0][1,1]

所以基本上我只想要与二维数组中某个特定点相邻的元素。

这是我到目前为止所做的: 我已经做到了,它在代码的开头分配了 4 个变量:starting_rowending_rowstarting_columnending_column。这些变量根据用户想要输入的坐标分配值(如果它们的行是 0 或 len(list) 则 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 列表(所有列表都是方形列表)

【问题讨论】:

  • 对于标准列表,您必须使用 lst[row][column] 而不是 lst[row,column]
  • 使用range() 和更高版本的lst[row][column] 你会得到错误index out of the range。更好的切片列表 - rows = lst[(row-1):(row+2)]。即使你使用了错误的索引,你也不会出错——而且你不必检查你是否在[0][0]
  • 您也可以使用 NumPy 数组并进行垂直切片 stackoverflow.com/questions/17277100/…

标签: python


【解决方案1】:

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

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

get_adjacent_items(m, 0, 0) 返回:[1, 3, 4, 2]

get_adjacent_items(m, 1, 1) 返回:[1, 3, 7, 4, 2, 9, 13, 5, 6]

get_adjacent_items(m, 2, 1) 返回:[4, 2, 9, 13, 5, 6]

get_adjacent_items(m, 2, 2) 返回:[2, 9, 5, 6]

【讨论】:

  • 嗯。它确实有效。那很有意思。我以前从未见过i for r in... 循环。我猜你是在冒号后面的行和列中添加 2,因为每行/列中的最后一个元素将在元素本身之后为 1(它是独占的,所以我们使用 +2 而不是 +1)。如我错了请纠正我。这可以不写在一行中吗(我不想要这个答案,也许只是一个提示)。
  • 是的,你是对的,为什么需要将 2 添加到切片的停止索引(它是唯一的)。我已经用嵌套 for 循环的等效实现更新了我的答案。
猜你喜欢
  • 2020-05-23
  • 2014-07-11
  • 1970-01-01
  • 2020-05-30
  • 2011-07-18
  • 2014-06-11
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多