在python中迭代嵌套列表

在python中迭代嵌套列表,python,list,nested,loops,Python,List,Nested,Loops,我试图遍历一个列表,并根据几个条件在子列表中重新排列列表中的项目,所有这些都在原始列表中。因此,使用Python中的以下代码,而列表1通过分组0、1和2正确打印: new list 1 = [['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']] 第二个列表中的所有内容都混在一起,试图通过以下方式将进一步的子列表重新分组为Bs Cs: new list 2 = [[['A0', 'A1', 'A2'], ['B0', 'B1',

我试图遍历一个列表,并根据几个条件在子列表中重新排列列表中的项目,所有这些都在原始列表中。因此,使用Python中的以下代码,而列表1通过分组0、1和2正确打印:

new list 1 = [['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']]
第二个列表中的所有内容都混在一起,试图通过以下方式将进一步的子列表重新分组为Bs Cs:

new list 2 = [[['A0', 'A1', 'A2'], ['B0', 'B1', 'B2'], ['C0', 'C1', 'C2']]]
希望得到:

new list 1 = [[['A0'], ['B0'], ['C0']], [['A1'], ['B1'], ['C1']], [['A2'], ['B2'], ['C2']]]
下面是我使用的代码(很抱歉太长了,我肯定有一个非常精简的版本)


根据分组标准进行排序,然后使用:

演示:

>>> from itertools import groupby
>>> input = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2']
>>> key = lambda el: el[1]
>>> [[[el] for el in grouped] for group, grouped in groupby(sorted(input, key=key), key)]
[[['A0'], ['B0'], ['C0']], [['A1'], ['B1'], ['C1']], [['A2'], ['B2'], ['C2']]]
您的输出要求有点复杂;如果返回分组元素的列表就足够了,那么在
grouped
上调用
list()
就足够了:

>>> [list(grouped) for group, grouped in groupby(sorted(input, key=key), key)]
[['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']]

根据分组标准进行排序,然后使用:

演示:

>>> from itertools import groupby
>>> input = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2']
>>> key = lambda el: el[1]
>>> [[[el] for el in grouped] for group, grouped in groupby(sorted(input, key=key), key)]
[[['A0'], ['B0'], ['C0']], [['A1'], ['B1'], ['C1']], [['A2'], ['B2'], ['C2']]]
您的输出要求有点复杂;如果返回分组元素的列表就足够了,那么在
grouped
上调用
list()
就足够了:

>>> [list(grouped) for group, grouped in groupby(sorted(input, key=key), key)]
[['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']]
考虑,它接受iterable和块大小
n

import more_itertools as mit

data = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2']

list(mit.chunked(data, 3))
# [['A0', 'A1', 'A2'], ['B0', 'B1', 'B2'], ['C1', 'C0', 'C2']]

list(mit.chunked(list(mit.chunked(data, 1)), 3))
# [[['A0'], ['A1'], ['A2']], [['B0'], ['B1'], ['B2']], [['C1'], ['C0'], ['C2']]]
考虑,它接受iterable和块大小
n

import more_itertools as mit

data = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2']

list(mit.chunked(data, 3))
# [['A0', 'A1', 'A2'], ['B0', 'B1', 'B2'], ['C1', 'C0', 'C2']]

list(mit.chunked(list(mit.chunked(data, 1)), 3))
# [[['A0'], ['A1'], ['A2']], [['B0'], ['B1'], ['B2']], [['C1'], ['C0'], ['C2']]]

作为一般建议:几乎总是有比硬编码元素数量(在您的例子中是子列表的数量)更好的解决方案。如果您将其推广到未知数量的子列表,那么您的代码将更加灵活和可重用。作为一般建议:几乎总有比硬编码元素数量(在您的情况下是子列表的数量)更好的解决方案。如果您将其泛化为未知数量的子列表,那么您的代码将更加灵活和可重用。