如何以更Pythonic的方式遍历列表的固定长度分割子组?支持Numpy
更Pythonic的列表固定长度分组遍历方法
需求说明
现有列表[1,2,3,4,5,6],需要将其按固定长度2分割为连续子组:[1,2]、[3,4]、[5,6],并遍历这些子组。以下是常规的朴素实现:
L = [1,2,3,4,5,6] N = len(L)//2 for k in range(N): slice = L[k*2:(k+1)*2] for val in slice: # 处理子组内元素
现在需要更符合Python风格的实现方式,同时接受基于numpy arrays的解决方案,期望实现类似以下的简洁形式:
L = [1,2,3,4,5,6] slices = f(L,2) # 这里需要一个简洁的函数f for slice in slices: for val in slice: # 处理子组内元素
Python原生方案(无需额外依赖)
1. 生成器函数(内存友好)
适合处理大数据量,避免一次性生成所有子组占用内存:
def chunk_list(lst, chunk_size): for i in range(0, len(lst), chunk_size): yield lst[i:i+chunk_size] # 使用示例 L = [1,2,3,4,5,6] for chunk in chunk_list(L, 2): for val in chunk: # 处理元素逻辑
2. 列表推导式(一次性生成所有子组)
如果需要直接获取完整子组列表,可使用列表推导:
chunk_size = 2 L = [1,2,3,4,5,6] slices = [L[i:i+chunk_size] for i in range(0, len(L), chunk_size)] # 遍历示例 for chunk in slices: for val in chunk: # 处理元素逻辑
3. itertools工具类(简洁迭代)
利用itertools.islice实现无冗余的分组迭代:
import itertools def chunk_iter(lst, chunk_size): it = iter(lst) while True: chunk = list(itertools.islice(it, chunk_size)) if not chunk: break yield chunk # 使用示例 L = [1,2,3,4,5,6] for chunk in chunk_iter(L, 2): for val in chunk: # 处理元素逻辑
NumPy方案
针对NumPy数组,可直接利用形状调整实现高效分组:
import numpy as np arr = np.array([1,2,3,4,5,6]) # 调整为(N, chunk_size)形状,要求数组长度能被分组长度整除 chunks = arr.reshape(-1, 2) # 遍历示例 for chunk in chunks: for val in chunk: # 处理元素逻辑
注意:若原列表/数组长度无法被分组长度整除,原生Python方案会自动将剩余元素作为最后一个短子组;NumPy的
reshape会报错,此时可先截断数组(如arr[:len(arr)//2*2].reshape(-1,2)),或使用np.array_split处理不等长分组。
内容的提问来源于stack exchange,提问作者Fra93
相关产品推荐
相关产品推荐

