itertools.groupby键函数生成零值和非零值分组

1 投票
1 回答
640 浏览
提问于 2025-04-28 14:02

有没有人知道我该如何使用 key 这个参数,在 itertools.groupby 函数中根据零和非零的值来分组数据行呢?

这里有个简单的例子:

from collections import namedtuple
from operator import attrgetter
from itertools import groupby

FakeRow = namedtuple('FakeRow', ['start_date_time', 'wear_sensor', 
                                 'part_number', 'chip_count'])

data = [
    FakeRow(1,1,'999-045', 0),
    FakeRow(2,1,'999-045', 4),
    FakeRow(3,1,'999-045', 3),
    FakeRow(3,1,'999-047', 0),
    FakeRow(4,1,'999-045', 0),
    FakeRow(5,1,'999-047', 1),
]                         

# need to groupby start date time first
unique_keys = []
groups = []
data = sorted(data, key=attrgetter('start_date_time'))

# want to group by 'chip_count' but by zero and non-zero values
for k, g in groupby(data, key=my_key_func(*args)):
    groups.append(list(g))
    unique_keys.append(k)

def my_key_func(*args):
    '''Help itertools.groupby group by zeros, or group by anything non-zero'''
    pass

我想要的输出结果是:

groups == [
    [FakeRow(1,1,'999-045', 0)],
    [FakeRow(2,1,'999-045', 4),FakeRow(3,1,'999-045', 3)],
    [FakeRow(3,1,'999-047', 0), FakeRow(4,1,'999-045', 0)],
    [FakeRow(5,1,'999-047', 1)]
]

谢谢。

暂无标签

1 个回答

1

这件事应该和查看假行的芯片数量的真假值一样简单:

def my_key_func(fakerow):
    return bool(fakerow.chip_count)

在这种情况下,你的 unique_keys 会是 TrueFalse,这可能不是你想要的结果。你可能想用一个集合,并用 update 方法来更新 fakerow.chip_count

unique_keys = set()
for k, g in groupby(data, key=my_key_func):
    group = list(g)
    groups.append(group)
    unique_keys.update(fk.chip_count for fk in group)

撰写回答