基于指定范围从单个列表生成嵌套列表的实现方法
如何将平展列表按指定范围生成嵌套列表?
这个需求在Python里有好几种优雅的实现方式,我给你整理几个常用的方案,你可以根据自己的场景选择:
方法一:列表推导式+切片(最简洁直观)
这是Python开发者最常用的写法,利用列表切片的特性一行就能搞定:
li = [1,2,3,4,5,6,7,8,9] chunk_size = 3 # 指定的范围参数 result = [li[i:i+chunk_size] for i in range(0, len(li), chunk_size)] print(result) # 输出: [[1,2,3],[4,5,6],[7,8,9]]
原理说明:
range(0, len(li), chunk_size)会生成从0开始、步长为chunk_size的索引序列(这里就是0、3、6)- 每次取
li[i:i+chunk_size]的切片,正好把原列表按指定大小拆分成子列表 - 如果原列表长度不是
chunk_size的整数倍,最后一个子列表会自动包含剩余的元素(比如原列表是[1,2,3,4,5],chunk_size=3,结果会是[[1,2,3],[4,5]])
方法二:循环手动构建(适合新手理解逻辑)
如果你想更清晰地看到拆分的每一步,用循环一步步构建也是个不错的选择:
li = [1,2,3,4,5,6,7,8,9] chunk_size = 3 result = [] temp_chunk = [] for num in li: temp_chunk.append(num) # 当临时列表达到指定长度时,加入结果并重置 if len(temp_chunk) == chunk_size: result.append(temp_chunk) temp_chunk = [] # 处理原列表长度不是chunk_size倍数的情况(可选) if temp_chunk: result.append(temp_chunk) print(result)
这种写法逻辑直白,每一步都可控,适合刚接触Python的朋友理解分组的核心过程。
方法三:用itertools工具包(通用型更强)
如果需要处理更复杂的分组场景(比如给不足长度的分组填充指定值),可以用itertools里的工具:
from itertools import zip_longest li = [1,2,3,4,5,6,7,8,9] chunk_size = 3 # 方式1:用指定值填充不足的分组(比如None) result = list(map(list, zip_longest(*[iter(li)]*chunk_size, fillvalue=None))) # 方式2:直接忽略不足长度的剩余元素,用zip即可 result = list(map(list, zip(*[iter(li)]*chunk_size))) print(result) # 两种方式输出都是[[1,2,3],[4,5,6],[7,8,9]]
原理说明:
[iter(li)]*chunk_size创建了chunk_size个指向同一个迭代器的引用zip或zip_longest会从每个迭代器中取一个元素,相当于把原列表按chunk_size个元素一组拆分zip_longest可以通过fillvalue参数指定不足分组时的填充值,灵活性更高
内容的提问来源于stack exchange,提问作者GeekGroot
相关产品推荐
相关产品推荐

