Python itertools.groupby中的组大小限制

Python itertools.groupby中的组大小限制,python,python-3.7,itertools,Python,Python 3.7,Itertools,我正在寻找一种解决方案,如何限制由itertools.groupby创建的组的组大小 目前我有这样的想法: >s='555' >>>分组=分组依据 >>>打印([(k,len(list(g)))用于分组中的k,g]) [('5', 3)] 我希望实现的是最大组的大小为2,因此我的输出为: [('5',2),('5',1)] 有没有简单有效的方法来做到这一点?可能是通过键参数提供给groupby?这里有一个使用groupby和defaultdict的解决方案 从itertools导入group

我正在寻找一种解决方案,如何限制由
itertools.groupby
创建的组的组大小

目前我有这样的想法:

>s='555'
>>>分组=分组依据
>>>打印([(k,len(list(g)))用于分组中的k,g])
[('5', 3)]
我希望实现的是最大组的大小为2,因此我的输出为:

[('5',2),('5',1)]

有没有简单有效的方法来做到这一点?可能是通过
参数提供给
groupby

这里有一个使用
groupby
defaultdict
的解决方案

从itertools导入groupby
从集合导入defaultdict
s=“5555444”
所需长度=2
计数=defaultdict(int)
def计数(x):
全球计数
c=计数[x]
计数[x]+=1
返回c
grouped=groupby(s,key=lambda x:(x,count(x)//所需的长度))
打印([(k[0],len(list(g)))用于分组中的k,g])
老实说,我认为这个解决方案是不可接受的,因为它要求你随时跟踪全球状况,但事实就是如此。我个人会使用一个类似缓冲区的东西

从集合导入defaultdict
s=“5555444”
def my_buffer_函数(序列、所需长度):
缓冲区=defaultdict(int)
对于顺序中的项目:
缓冲区[项目]+=1
如果缓冲区[项目]==所需的长度:
收益率(项目、缓冲区、pop(项目))
对于缓冲区中的k,v.items():
产量k,v
打印(列表(my_buffer_函数,2)))

这也是一台发电机。但是它可能会错过groupby目前所依赖的一些东西。

您可以使用关键参数和一个单独的
global
计数器来跟踪groupby到目前为止所看到的情况。但我认为这是一个糟糕的解决方案。最好只编写一个自定义函数来实现这一点。