2014-10-20 31 views
0

有沒有人有一個想法,我將如何利用itertools.groupby函數中的 func參數將數據行分爲零和非零零值?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)] 
] 

感謝。

回答

1

它應該是爲看假行的chip_count的布爾值一樣簡單:

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

在這種情況下,您的unique_keysTrueFalse不是你想要的這是可能的。你可能會想用一組和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) 
+0

非常感謝。我結束了循環:對於groupby(數據,lambda x:bool(x.chip_count))中的k,g,這些工作。它不喜歡*參數。我收到一個錯誤,說args沒有定義。 – PlacidLush 2014-10-20 15:37:42

+0

@PlacidLush - 抱歉,它應該是'key = my_key_func',而不是'key = my_key_func(* args)'。 – mgilson 2014-10-20 15:44:00

+0

不用擔心。這個小小的細微差別幫助我更好地理解發生了什麼。 – PlacidLush 2014-10-20 16:34:07