Aqui está um exemplo R de usoReduce
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`
O código acima serve para classificar os valores exclusivos da extração em termos de duração da execução, que podem ser facilmente obtidos por rle(x)$values
.
Eu sei que em Python existe itertools.groupby
que executa a mesma coisa que rle
em R, MAS, o que estou curioso é : é possível ter uma tradução altamente semelhante usando functools.reduce
em Python para obter a mesma funcionalidade, digamos, por exemplo
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)
mas que infelizmente dá erros como
{
"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"
}
Minha pergunta é : existe alguma linha reduce
em Python que se pareça com o código R?
você poderia usar uma lista como inicial:
Observe que você pode usar
groupby
fromitertools
:Aqui está outra solução apenas para destacar a diferença. Em R, um escalar também é um vetor de comprimento 1, então tail() ou c() não tem problemas, enquanto Python não tem conceito de escalar[-1] ou escalar + lista.