首页 > 解决方案 > 将嵌套列表更改为多个单个列表

问题描述

如果我有一个清单:

[[ A, B, C ], 10, [ 1, 2, 3 ], F]

将其更改为的最佳方法是什么:

[ A, 10, 1, F]
[ B, 10, 2, F]
[ C, 10, 3, F]

嵌套列表的长度是一致的:len(list[0]) == len(list[2]),但len(list[0])可能是3, 2, 4,等等。

标签: pythonlistnested-lists

解决方案


让我们在这里试试itertools

from itertools import cycle

list(zip(*(iter(x) if isinstance(x, list) else cycle([x]) for x in l)))
# [('A', 10, 1, 'F'), ('B', 10, 2, 'F'), ('C', 10, 3, 'F')]

请注意,如果子列表大小不等,这不会出错 - 输出的大小等于最短子列表的大小。


这个怎么运作

遍历列表,如果项目是列表,则将其转换为带有 的迭代器iter,否则如果是标量,则将其转换为循环迭代器(无限重复单个值)并将它们压缩在一起并列出。

步骤 0

 A     10    1      F
 B           2   
 C           3
l[0]  l[1]  l[2]  l[3]

步骤1

(iter(x) if isinstance(x, list) else cycle([x]) for x in l)

 A     10    1      F
 B     10    2      F
 C     10    3      F
l[0]  l[1]  l[2]  l[3]

第2步

list(zip(*_))
[('A', 10, 1, 'F'), ('B', 10, 2, 'F'), ('C', 10, 3, 'F')]

推荐阅读