You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以更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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:41:31