itertools.groupby中组大小的限制

问题描述 投票:2回答:1

我正在寻找一种解决方案,该方法如何限制由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吗?

python python-3.7 itertools
1个回答
0
投票

这里是使用groupbydefaultdict的解决方案。

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您当前依赖的某些东西。

© www.soinside.com 2019 - 2024. All rights reserved.