如何用Python的functools.reduce实现类似R中Reduce的连续去重功能?
用Python的functools.reduce实现连续重复值去重
你之前的代码报错是因为reduce默认会将列表第一个元素作为初始累积值a,此时a是整数类型,无法通过a[-1]访问元素。
要实现和R中Reduce风格一致的一行代码,只需给reduce指定初始累积值为列表,并调整判断逻辑:
from functools import reduce x = [1,2,2,4,10,5,5,7] # 通用版,支持空列表输入 reduce(lambda a, b: a + [b] if not a or a[-1] != b else a, x, [])
运行后得到结果[1, 2, 4, 10, 5, 7],和R中rle(x)$values的效果完全一致。
如果确定输入列表非空,也可以写成更贴近R原代码逻辑的版本:
reduce(lambda a, b: a + [b] if a[-1] != b else a, x[1:], [x[0]])
内容的提问来源于stack exchange,提问作者ThomasIsCoding
相关产品推荐
相关产品推荐

