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

如何以缺失值为分隔符分组列表并混合整数与字符串数据

解决:以NaN为分隔符合并非NaN的整数与字符串分组

承接Stack Overflow问题《I want to group data in a list with missing values as delimiter》,现有如下示例数据:

data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']

原代码及问题

使用以下代码尝试分组:

from math import nan
from itertools import groupby

data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']

g = groupby(data, key=type)  # 按数据类型分组,int与float类型不同
groups = [list(a[1]) for a in g if a[0] != float]  

print(groups)  

得到结果:

[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0], ['hello']]

但期望将末尾的整数与字符串合并为一组,目标结果:

[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]

尝试调整过滤条件groups = [list(a[1]) for a in g if a[0] != float or a[0] == str]无效,因为groupby已按type把int和str拆分成独立组,后续过滤无法合并已拆分的组。

解决方案

修改groupby的分组规则,不再按元素类型分组,而是将NaN作为分隔标记,连续的非NaN元素归为同一组:

from math import nan
from itertools import groupby
import math

data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']

# 自定义key:标记元素是否为NaN,连续非NaN元素会被归为同一组
g = groupby(data, key=lambda x: math.isnan(x) if isinstance(x, float) else False)

# 过滤掉NaN对应的组,收集非NaN组的元素
groups = [list(group) for key, group in g if not key]

print(groups)

运行后得到期望结果:

[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]

说明

自定义的key函数逻辑:

  • 若元素是float类型,判断是否为NaN,是则返回True,否则返回False
  • 非float类型的元素(int、str等)直接返回False
    groupby会将连续返回False的元素分到同一组,NaN返回的True则作为分组分隔符,最终过滤掉NaN组即可得到目标分组结果。

内容的提问来源于stack exchange,提问作者Erwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:05:28