如何用一个整数的倍数对近距离项目进行分组

时间:2014-03-26 09:02:10

标签: python group-by

我的目标是将下面的列表分组为7 (ie 7,14,21)

的倍数
mylist=[1,3,7,8,10,14,15,19,22]

理想的结果:[(1,3,7),(8,10,14),(15,19),(22)]

我的尝试:

>>>groups=[]
>>> for x in itertools.groupby(mylist,lambda x: x<=range(7,49,7)):
             groups.append(x)
>>> groups
[(True, <itertools._grouper object at 0x0000000002EBC128>)]

有关如何达到理想结果的任何想法?感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用:

itertools.groupby(mylist, lambda x: (x - 1) // 7)

您当前的尝试会将每个项目与range对象进行比较,而不是它生成的值。这没有任何意义,并且是Python 3.x中的TypeError

groupby对象解压缩到元组列表:

list(map(lambda g: tuple(g[1]), itertools.groupby(...)))

答案 1 :(得分:2)

jonrsharpe提供了一个很好的解决方案。这个替代方案是通用的(不一定是特定于Python的)并且由于显而易见的原因是正确的:

groups = []
l = [1,3,7,8,10,14,15,19,22]
a = 0
sublist = []
for item in l:
    if 7*a<item and item<=7*(a+1):
        sublist.append(item)
    else:
        groups.append(tuple(sublist))
        a = item/7 
        sublist = [item]

if sublist:
    groups.append(tuple(sublist))

答案 2 :(得分:-1)

我认为此代码可以帮助您:

if __name__ == '__main__':
    a = [1,3,7,8,10,14,15,19,22]
    b = []
    c = set()
    for i in a:
        x = i/7
        if i%7 == 0:
            x -= 1
        b.append(x)
        c.add(x)
    c = list(c)
    a.sort()
    res = []
    for i in c:
        res.append(b.count(i))
    count = 0
    for i in res:
        print a[count:count+i]
        count += i