我的目标是将下面的列表分组为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>)]
有关如何达到理想结果的任何想法?感谢。
答案 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