Método eficiente para calcular o vetor de classificação de uma lista em Python

Estou procurando uma maneira eficiente de calcular o vetor de classificação de uma lista em Python, semelhante aos R'srank função. Em uma lista simples sem vínculos entre os elementos, elementoi do vetor de classificação de uma listal deveria estarx se e apenas sel[i] é ox-ésimo elemento na lista classificada. Até agora, isso é simples, o seguinte snippet de código faz o truque:

def rank_simple(vector):
    return sorted(range(len(vector)), key=vector.__getitem__)

As coisas ficam complicadas, no entanto, se a lista original tiver vínculos (ou seja, vários elementos com o mesmo valor). Nesse caso, todos os elementos com o mesmo valor devem ter a mesma classificação, que é a média de suas classificações obtida usando o método ingênuo acima. Então, por exemplo, se eu tiver[1, 2, 3, 3, 3, 4, 5], o ranking ingênuo me dá[0, 1, 2, 3, 4, 5, 6], mas o que eu gostaria de ter é[0, 1, 3, 3, 3, 5, 6]. Qual seria a maneira mais eficiente de fazer isso no Python?

Nota de rodapé: Não sei se o NumPy já tem um método para conseguir isso ou não; se houver, informe-me, mas eu estaria interessado em uma solução Python pura de qualquer maneira, pois estou desenvolvendo uma ferramenta que deve funcionar sem o NumPy também.

questionAnswers(8)

yourAnswerToTheQuestion