3 回答

TA贡献1735条经验 获得超5个赞
我很好的用例itertools.groupby:
>>> from itertools import groupby
>>> list_before = [1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8]
>>> list_after = []
>>> for k, group in groupby(list_before):
... lst = list(group)
... if len(lst) >= 3:
... list_after.append(k)
... else:
... list_after.extend(lst)
>>> list_after
[1, 2, 3, 4, 5, 6, 6, 7, 8]
有可能制作一个单行,itertools.chain但for循环几乎可以肯定更具可读性和类似的性能。

TA贡献1829条经验 获得超6个赞
>>> from itertools import groupby >>> nums = [1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8] >>> [k for k, g in groupby(nums) for i in range(1 + (len(list(g)) == 2))] [1, 2, 3, 4, 5, 6, 6, 7, 8]

TA贡献1827条经验 获得超8个赞
正如克里斯在他的回答中指出的那样,单线是可能的,但它一点也不漂亮。
In [88]: list(chain.from_iterable([(x,) if len(y) >= 3 else y for x, y in [(k, tuple(g)) for k, g in groupby(list_before)]]))
Out[88]: [1, 2, 3, 4, 5, 6, 6, 7, 8]
我认为应该有更好的方法,但chain在处理不可迭代对象时已经足够了。
添加回答
举报