通过第0个元素

时间:2016-01-12 02:17:58

标签: python python-2.7

我希望能够将列表列表分成块,按第0个元素分组。第0个元素(本例中为Group Number)必须始终保持分组。如果两个多个组可以配对在一起,只要它们保持在块大小之下,它们应该是。我已经根据块大小突破了子列表,但无法弄清楚如何让群号保持在一起。

def chunks(l, n):

    for i in xrange(0, len(l), n):
        yield l[i:i+n]

chunk_size = 3
mydata = [['Group 1', 140], ['Group 1', 210], ['Group 1', 112], ['Group 2', 130], ['Group 3', 124], ['Group 3', 1], ['Group 4', 2]]
test = chunks(mydata, chunk_size )
for x in test:
    print x

预期产出:

[['Group 1', 140], ['Group 1', 210], ['Group 1', 112]]
[['Group 2', 130], ['Group 3', 124], ['Group 3', 1]]
[['Group 4', 2]]

1 个答案:

答案 0 :(得分:0)

使用itertools.groupby,您可以将迭代组分组为子组。

import itertools

def chunks(l, n):
    chunk = []
    for key, grp in itertools.groupby(l, key=lambda x: x[0]):
        grp = list(grp)
        if len(chunk) + len(grp) <= n:
            chunk.extend(grp)
            grp = []

        while len(chunk) + len(grp) >= n:
            yield chunk
            chunk, grp = grp, []
    if chunk:
        yield chunk

用法:

>>> chunk_size = 3
>>> mydata = [ 
...     ['Group 1', 140], ['Group 1', 210], ['Group 1', 112],
...     ['Group 2', 130], ['Group 3', 124], ['Group 3', 1], ['Group 4', 2]]
>>> test = chunks(mydata, chunk_size )
>>> for x in test:
...     print x
... 
[['Group 1', 140], ['Group 1', 210], ['Group 1', 112]]
[['Group 2', 130], ['Group 3', 124], ['Group 3', 1]]
[['Group 4', 2]]