python - 如何使用递归将列表拆分为块?
问题描述
这里有一个增加 int 的列表,我想将它逐步拆分成块,如下所示:
for i in range(0, len(intlist), length):
chunks.append(intlist[i, i+length])
但是块中的每个列表都必须匹配list[-1] - list[0] < 20
。如果不匹配,请尝试chunks.append(intlist[i, i+length-1])
例如:
chunks = []
intlist = [2, 4, 5, 18, 23, 24, 67, 72, 77, 83, 84, 90] # item keep increase
for i in range(0, len(intlist), 4):
chunks.append(intlist[i:i+4])
# output
# item in chunks
[2, 4, 5, 18] # step 4 match
[23, 24] # 67-23>20 don't mach
[67, 72, 77, 84] # match
[90]
特别是,len(i) 必须小于参数长度,不能太长
解决方案
此任务不需要递归。您可以简单地遍历列表并继续将当前项与最后一个块的第一项进行比较,如果差异大于或等于 20 或最后一个块已达到最大块大小,则附加一个新的子列表:
intlist = [2, 4, 5, 18, 23, 24, 67, 72, 77, 83, 84, 90]
chunks = []
for i in intlist:
if not chunks or i - chunks[-1][0] >= 20 or len(chunks[-1]) == 4:
chunks.append([])
chunks[-1].append(i)
chunks
变成:
[[2, 4, 5, 18], [23, 24], [67, 72, 77, 83], [84, 90]]
推荐阅读
- sonarqube - 发现 Angular 升级 no-misused-new 后声纳网关失败
- reactjs - React axios 响应 -> 授权值未出现在标题中
- linux - 从linux连接oracle时在oracle alter命令中连接输入变量
- javascript - 我需要使用 Pug 模板遍历 Eleventy 收集
- flutter - 如何将 fold 方法用于未来类型?
- environment-variables - 使用 consul-template 从 Consul KV 分配环境变量
- java - 在 Java 中使用 SSL cwallet.sso 连接 Oracle 数据库
- python - 仅在不存在时创建新实例,否则返回现有而不进行新初始化
- c# - Netcore 3.0 与 5.0 的区别,NullReferenceException 与 WriteValueWithResultAsync (BLE Lib)
- git - 是否可以忽略 IntelliJ IDEA 中的远程存储库之一