python - 将嵌套列表更改为多个单个列表
问题描述
如果我有一个清单:
[[ 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
,等等。
解决方案
让我们在这里试试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')]
推荐阅读
- r - 按行名过滤矩阵的嵌套列表
- python - 使用 fork() 和 exec() 从 C++ 执行 Python 代码
- javascript - 以 html 和 Text 格式获取整个 Playwright 页面
- javascript - 如何一一使用几个setTimeout?
- flutter - Flutter 信用卡/借记卡扫描仪
- cs50 - cs50 caeser,我不明白 check50 失败
- spring-boot - AWS NLB 上的 Springboot OIDC 客户端应用程序,两个 EC2 随机给出 403
- string - Ada - 使用 S'length 输入字符串
- javascript - 如何覆盖从“@ .MuiAlert-icon”继承的填充?
- arduino - Arduino游戏的定时器中断不起作用