如何在Python中对列表进行不规则分区?是否存在对应内置函数
在Python中实现列表的不规则分区
嘿,这个需求我之前也碰到过!Python本身并没有直接提供和Wolfram Language里Partition[Range@5, UpTo@2]完全对应的内置函数,但我们可以用几种简单的方式轻松实现这个效果——把列表按指定大小分区,最后一段允许不足指定长度。
下面给你几种实用的实现方式:
1. 最简洁的列表推导式
这是日常开发里最常用的方法,一行核心代码就能搞定:
def partition(vals, chunk_size): return [vals[i:i+chunk_size] for i in range(0, len(vals), chunk_size)]
测试你的例子看看:
vals = [1,2,3,4,5] print(partition(vals, 2)) # 输出: [[1, 2], [3, 4], [5]]
原理很直观:从索引0开始,每次以chunk_size为步长截取列表切片,最后一段如果元素不足chunk_size,切片会自动取到列表末尾,完美匹配你的需求。
2. 内存友好的生成器实现(适合大列表)
如果你的列表特别大,不想一次性生成所有切片占用内存,可以用迭代器的方式实现,每次只生成一个分区:
from itertools import islice def partition_generator(vals, chunk_size): iter_vals = iter(vals) while True: chunk = list(islice(iter_vals, chunk_size)) if not chunk: break yield chunk
使用的时候转成列表即可:
vals = [1,2,3,4,5] print(list(partition_generator(vals, 2))) # 输出: [[1, 2], [3, 4], [5]]
这种方式不会一次性把所有切片都加载到内存里,处理超大数据集时更高效。
3. 手动循环实现(适合新手理解)
如果你想更清楚地看到每一步的逻辑,可以用循环手动构建结果:
def partition_loop(vals, chunk_size): result = [] current_chunk = [] for num in vals: current_chunk.append(num) # 当当前分区达到指定大小,就加入结果并重置 if len(current_chunk) == chunk_size: result.append(current_chunk) current_chunk = [] # 处理最后一段不足指定大小的元素 if current_chunk: result.append(current_chunk) return result
测试同样能得到你想要的结果,这种写法逻辑清晰,适合刚学Python的朋友理解分区的过程。
内容的提问来源于stack exchange,提问作者Edmund
相关产品推荐
相关产品推荐

