Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python itertools.groupby key funct生成零值和非零值分组_Python_Python 2.7_Itertools - Fatal编程技术网

Python itertools.groupby key funct生成零值和非零值分组

Python itertools.groupby key funct生成零值和非零值分组,python,python-2.7,itertools,Python,Python 2.7,Itertools,有人知道我如何利用itertools.groupby函数中的key func参数按零值和非零值对数据行进行分组吗 举一个简单的例子: from collections import namedtuple from operator import attrgetter from itertools import groupby FakeRow = namedtuple('FakeRow', ['start_date_time', 'wear_sensor',

有人知道我如何利用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)]
]

谢谢。

这应该和查看伪行chip\u计数的布尔值一样简单:

def my_key_func(fakerow):
    return bool(fakerow.chip_count)
在这种情况下,您的
唯一_键
将为
True
False
,这可能不是您想要的。您可能希望使用set和
update
代替
fakerow.chip\u 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)

非常感谢。最后我做了一个循环:对于groupby中的k,g(数据,lambda x:bool(x.chip_count)),这很有效。它不喜欢*args。我收到一个错误,说没有定义args。@PlacidLush--很抱歉,它应该是
key=my\u key\u func
,而不是
key=my\u key\u func(*args)
。不用担心。这一细微差别帮助我更好地理解了发生的事情。