2013-10-24 26 views
1

我想将符合谓词的连续元素分组。一种这样的函数文档测试看起来像Python - 分组满足谓词的连续元素

>>> group([1, 2, 3, 0, 4, 5, 0, 0, 6], lambda x: x != 0) 
    [[1, 2, 3], [4, 5], [6]] 
>>> group([1, 2, 3, 0, 4, 5, 0, 0, 6], lambda x: x == 0) 
    [[0], [0, 0]] 

我写了一个原型,我使用itertool的takewhile,而是因为我一直名单和国际热核实验堆之间铸造它的丑陋。我也不想坚持阅读列表的索引,因为它感觉效率低下。有人能指点我如何以正确的方式将itertools混合在一起吗?

from itertools import takewhile 

def group(l, p): 
    blocks = [] 
    while True: 
     i = iter(l) 
     taken = list(takewhile(p, i)) 
     l = list(i) 
     if len(taken) > 0: 
      blocks.append(taken) 
     if len(l) == 0: 
      return blocks 

谢谢!

+4

出了什么问题'itertools.groupby'? –

+0

无法解决如何使用它,但现在我可以。谢谢大家。 – Derek

回答

4

你可以使用itertools.groupby

In [22]: import itertools as IT 

In [23]: [list(g) for k, g in IT.groupby(
      [1, 2, 3, 0, 4, 5, 0, 0, 6], lambda x: x != 0) if k] 
Out[23]: [[1, 2, 3], [4, 5], [6]] 
1

使用itertools.groupby

>>> import itertools 
>>> 
>>> data = [1, 2, 3, 0, 4, 5, 0, 0, 6] 
>>> xs = [list(grp) for k, grp in itertools.groupby([1, 2, 3, 0, 4, 5, 0, 0, 6], lambda x: x == 0)] 
>>> xs 
[[1, 2, 3], [0], [4, 5], [0, 0], [6]] 

>>> xs[data[0] == 0::2] 
[[1, 2, 3], [4, 5], [6]] 
>>> xs[data[0] != 0::2] 
[[0], [0, 0]] 
相关问题