下面是使用 R 语言的示例Reduce
x <- c(1, 2, 2, 4, 10, 5, 5, 7)
Reduce(\(a, b) if (tail(a, 1) != b) c(a, b) else a, x) # equivalent to `rle(x)$values`
上面的代码是按照游程长度对提取的唯一值进行排序,可以通过 轻松获得rle(x)$values
。
我知道在 Python 中可以itertools.groupby
执行与 R 中相同的操作rle
,但是,我很好奇的是:是否可以通过functools.reduce
在 Python 中使用来实现高度相似的翻译来实现相同的功能,例如
from functools import reduce
x = [1,2,2,4,10,5,5,7]
reduce(lambda a, b: a + [b] if a[-1]!= b else a, x)
但不幸的是,它给出了如下错误
{
"name": "TypeError",
"message": "'int' object is not subscriptable",
"stack": "---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[58], line 4
1 from functools import reduce
2 x = [1,2,2,4,10,5,5,7]
----> 4 reduce(lambda a, b: a + [b] if a[-1]!= b else a, x)
Cell In[58], line 4, in <lambda>(a, b)
1 from functools import reduce
2 x = [1,2,2,4,10,5,5,7]
----> 4 reduce(lambda a, b: a + [b] if a[-1]!= b else a, x)
TypeError: 'int' object is not subscriptable"
}
我的问题是reduce
: Python 中是否有任何看起来像 R 代码的单行代码?
您可以使用列表作为初始:
请注意,您可以
groupby
使用itertools
:这是另一种解决方案,只是为了突出差异。在 R 中,标量也是长度为 1 的向量,因此 tail() 或 c() 没有问题,而 Python 没有 scalar[-1] 或 scalar + list 的概念。