首页 > 解决方案 > 如何使用递归将列表拆分为块?

问题描述

这里有一个增加 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) 必须小于参数长度,不能太长

标签: pythonslice

解决方案


此任务不需要递归。您可以简单地遍历列表并继续将当前项与最后一个块的第一项进行比较,如果差异大于或等于 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]]

推荐阅读