Python 如何将嵌套列表拆分为较小的嵌套列表

Python 如何将嵌套列表拆分为较小的嵌套列表,python,python-3.x,Python,Python 3.x,所以我有一个嵌套列表作为输入(嵌套列表总是正方形的,即行数和列数相同)。我想把这个列表分解成另一个嵌套列表,其中的元素只是原始列表的2x2“部分” 例如,如果我的输入是 [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]] 我的输出应该是 [[1,2,5,6],[3,4,7,8],[9,10,13,14],[11,12,15,16] 另一个例子: 输入: 输出: [[1,2,5,6],[3,7],[9,10],[11] 我尝试创建一个嵌套的fo

所以我有一个嵌套列表作为输入(嵌套列表总是正方形的,即行数和列数相同)。我想把这个列表分解成另一个嵌套列表,其中的元素只是原始列表的2x2“部分”

例如,如果我的输入是

[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
我的输出应该是
[[1,2,5,6],[3,4,7,8],[9,10,13,14],[11,12,15,16]

另一个例子: 输入:

输出:
[[1,2,5,6],[3,7],[9,10],[11]

我尝试创建一个嵌套的for循环,该循环遍历前两列和前两行,并将其放入一个列表,然后将其追加到另一个列表,然后重复该过程,但我得到一个索引越界异常错误

这就是我到目前为止所做的

def get_2_by_2(map: List[List[int]]) -> int:
    i = 0
    j = 0
    lst_2d = []
    lst = []

    for row in range(i, min(i+2, len(map))):
        for column in range(j, min(j+2, len(map))):
            print(row,column)
            lst.append(map[row][column])  
    lst_2d.append(lst)
    return lst_2d

基本上,这个只返回第一个2x2。我尝试在外部使用while循环,增加I和j的值,使while循环依赖于其中一个。这导致索引超出范围。

您可以在2步中迭代行和列,并相应地对列表列表进行切片:

def get_2_by_2(matrix):
    output = []
    for row in range(0, len(matrix), 2):
        for col in range(0, len(matrix[0]), 2):
            output.append([i for r in matrix[row: row + 2] for i in r[col: col + 2]])
    return output
或使用嵌套列表:

def get_2_by_2(matrix):
    return [
        [i for r in matrix[row: row + 2]
        for i in r[col: col + 2]] for col in range(0, len(matrix[0]), 2)
    ]
因此,鉴于:

m = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
m = [[1, 2, 3],
     [5, 6, 7],
     [9, 10, 11]]
get_2_by_2(m)
返回:

[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]
[[1, 2, 5, 6], [3, 7], [9, 10], [11]]
鉴于:

m = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
m = [[1, 2, 3],
     [5, 6, 7],
     [9, 10, 11]]
get_2_by_2(m)
返回:

[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]
[[1, 2, 5, 6], [3, 7], [9, 10], [11]]

您可以在步骤2中遍历行和列,并相应地对列表列表进行切片:

def get_2_by_2(matrix):
    output = []
    for row in range(0, len(matrix), 2):
        for col in range(0, len(matrix[0]), 2):
            output.append([i for r in matrix[row: row + 2] for i in r[col: col + 2]])
    return output
或使用嵌套列表:

def get_2_by_2(matrix):
    return [
        [i for r in matrix[row: row + 2]
        for i in r[col: col + 2]] for col in range(0, len(matrix[0]), 2)
    ]
因此,鉴于:

m = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
m = [[1, 2, 3],
     [5, 6, 7],
     [9, 10, 11]]
get_2_by_2(m)
返回:

[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]
[[1, 2, 5, 6], [3, 7], [9, 10], [11]]
鉴于:

m = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
m = [[1, 2, 3],
     [5, 6, 7],
     [9, 10, 11]]
get_2_by_2(m)
返回:

[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]
[[1, 2, 5, 6], [3, 7], [9, 10], [11]]