【问题标题】:itertools.groupby key func to produce groupings of zero and non-zero valuesitertools.groupby key 函数产生零和非零值的分组
【发布时间】:2014-10-20 15:01:13
【问题描述】:

有谁知道我将如何利用 itertools.groupby 函数中的 key func 参数按零值和非零值对数据行进行分组?

举个简单的例子:

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)]
]

谢谢。

【问题讨论】:

    标签: python python-2.7 itertools


    【解决方案1】:

    应该就像查看假行的chip_count的布尔值一样简单:

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

    在这种情况下,您的unique_keys 将是TrueFalse,这可能不是您想要的。您可能希望使用 set 和 updatefakerow.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)
    

    【讨论】:

    • 非常感谢。我最终制作了循环:for k, g in groupby(data, lambda x: bool(x.chip_count)) 有效。它不喜欢 *args。我收到一条错误消息,提示未定义 args。
    • @PlacidLush -- 抱歉,应该是key=my_key_func,而不是key=my_key_func(*args)
    • 不用担心。这个细微的差别帮助我更好地理解发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多