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, 2
、3, 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)
将产生 0
、3
和 6
。然后我们将它们中的每一个映射到由嵌套列表理解创建的列表。
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]]
来自初始列表:
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, 2
、3, 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)
将产生 0
、3
和 6
。然后我们将它们中的每一个映射到由嵌套列表理解创建的列表。
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]]