我正在寻找一种解决方案,该方法如何限制由itertools.groupby
创建的群组的群组大小。
目前我有这样的东西:
>>> s = '555'
>>> grouped = groupby(s)
>>> print([(k, len(list(g))) for k, g in grouped])
[('5', 3)]
我想要实现的是使最大组的大小= 2,所以我的输出将是:
[('5', 2), ('5', 1)]
是否有任何简单有效的方法?也许可以通过key
参数提供给groupby
吗?
这里是使用groupby
和defaultdict
的解决方案。
from itertools import groupby
from collections import defaultdict
s = "5555444"
desired_length = 2
counts = defaultdict(int)
def count(x):
global counts
c = counts[x]
counts[x] += 1
return c
grouped = groupby(s, key=lambda x: (x, count(x) // desired_length))
print([(k[0], len(list(g))) for k, g in grouped])
老实说,这种解决方案是不可接受的,但实际上是这样。我个人只是使用类似缓冲区的东西。
from collections import defaultdict
s = "5555444"
def my_buffer_function(sequence, desired_length):
buffer = defaultdict(int)
for item in sequence:
buffer[item] += 1
if buffer[item] == desired_length:
yield (item, buffer.pop(item))
for k, v in buffer.items():
yield k, v
print(list(my_buffer_function(s, 2)))
这也是一个发电机。但是它可能会错过groupby您当前依赖的某些东西。