在python中迭代嵌套列表
我试图遍历一个列表,并根据几个条件在子列表中重新排列列表中的项目,所有这些都在原始列表中。因此,使用Python中的以下代码,而列表1通过分组0、1和2正确打印:在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',
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']]]
作为一般建议:几乎总是有比硬编码元素数量(在您的例子中是子列表的数量)更好的解决方案。如果您将其推广到未知数量的子列表,那么您的代码将更加灵活和可重用。作为一般建议:几乎总有比硬编码元素数量(在您的情况下是子列表的数量)更好的解决方案。如果您将其泛化为未知数量的子列表,那么您的代码将更加灵活和可重用。