Python:嵌套的列表列表,元素按 3 分组

Python: nested list of lists with elements grouped by 3

来自初始列表:

starting_list = [
    [1,2,3,        4,5,6,        7,8,9      ],
    [11,22,33,     44,55,66,     77,88,99   ],
    [111,222,333,  444,555,666,  777,888,999]
]

我想创建一个新列表(使用 for 循环或列表理解),其元素是 starting_list 的子列表,按三个元素分组并从每三个索引开始:

grouped_by_3_elements = [
    [1,2,3,  11,22,33,  111,222,333],
    [4,5,6,  44,55,66,  444,555,666],
    [7,8,9,  77,88,99,  777,888,999]
]

我已经完成了以下内容,但并不完全是我想要的

[ [1, 2, 3], [11, 22, 33], [111, 222, 333], [4, 5, 6], [44, 55, 66], [444, 555, 666], [7, 8, 9], [77, 88, 99], [777, 888, 999] ]

谢谢

••• 更新•••

对于那些想知道我是如何得出当前解决方案的人:

lst = [
[1,2,3,4,5,6,7,8,9],
[11,22,33,44,55,66,77,88,99],
[111,222,333,444,555,666,777,888,999]
]

new_lst = []

for col in range(0, len(lst[0]), 3):
    for row in range(3):
        new_lst.append(lst[row][col:col+3])    

print(new_lst)

>>> [[1, 2, 3], [11, 22, 33], [111, 222, 333], [4, 5, 6], [44, 55, 66], [444, 555, 666], [7, 8, 9], [77, 88, 99], [777, 888, 999]]

我能以某种方式达到我想要的吗

[
[1,2,3,  11,22,33,  111,222,333],
[4,5,6,  44,55,66,  444,555,666],
[7,8,9,  77,88,99,  777,888,999]
]

无需通过单独的循环 运行 我的结果 (new_lst) 来重新打包 ?

稍微改变一下:

new_lst = []

for col in range(0, len(lst[0]), 3):
    inner = []
    for row in range(3):
        inner += lst[row][col:col+3]
    new_lst.append(inner)

再改一点:

new_lst = []

for col in range(0, len(lst[0]), 3):
    inner = []
    for row in lst:
        inner += row[col:col+3]
    new_lst.append(inner)

在指示其他尺寸之前的旧解决方案:

类似于 3×3 矩阵的普通转置,只是行中有切片:

a = starting_list
for i in range(3):
    si = slice(i*3, i*3+3)
    for j in range(i):
        sj = slice(j*3, j*3+3)
        a[i][sj], a[j][si] = a[j][si], a[i][sj]
end_list = []
sublist_len = min(len(lst) for lst in starting_list)
for i in range(0, sublist_len, 3):
    group = []
    for lst in starting_list:
        group.append(lst[i:i+3])
    end_list.append([y for x in group for y in x])

首先我们从一个空列表开始。我们计算子列表的长度,因此我们不会在索引子列表时出现任何越界错误。

然后我们迭代这些子列表“块”的索引。 0, 1, 23, 4, 5

对于这些索引块中的每一个,我们通过将列表的一部分附加到每个子列表的 group 来创建一个组。在该循环结束时,我们使用一些列表理解逻辑来“展平”我们创建的列表列表,并将该列表附加到 end_list 列表。

最终结果?

[[1, 2, 3, 11, 22, 33, 111, 222, 333], [4, 5, 6, 44, 55, 66, 444, 555, 666], [7, 8, 9, 77, 88, 99, 777, 888, 999]]

我们也可以使用列表理解来完成此操作,使用与之前相同的 sublist_len。逻辑和以前一样,但更直接。 for i in range(0, sublist_len, 3) 将产生 036。然后我们将它们中的每一个映射到由嵌套列表理解创建的列表。

end_list = [[x for lst in starting_list for x in lst[i:i+3]] for i in range(0, sublist_len, 3)]

您可以在嵌套理解中使用子范围:

L = [
    [1,2,3,        4,5,6,        7,8,9      ],
    [11,22,33,     44,55,66,     77,88,99   ],
    [111,222,333,  444,555,666,  777,888,999]
]

r = [  [ n for r in L for n in r[c:c+3] ] for c in range(0,len(L[0]),3) ]
print(r)

[[1, 2, 3,   11, 22, 33,   111, 222, 333], 
 [4, 5, 6,   44, 55, 66,   444, 555, 666], 
 [7, 8, 9,   77, 88, 99,   777, 888, 999]]