Indeks wielkości wartości w nieposortowanej liście

0

Witajcie

Jeśli posiadam listę z wartościami przykładowymi:

lista = [10, 12, 9. 13, 19, 20]

W jaki sposób mogę określić ,że wartość 20 była by w rankingu 1 ,a wartość 18 nr 2 itp.

Wiem ,że można utworzyć drugą listę i posortować te wartości od najwyższej i pętlą zapytać położenie na nowej liście ,ale moje pytanie jest
takie jak określić wartości od największej do najmniejszej w nieposortowanej liście?
W excelu można było skorzystać z funkcji pozycja a czy Python posiada jakąś swoją metodę na rankingi?

oczekiwane = [5, 4, 6, 3, 2, 1]

Dziękuję za zainteresowanie i pozdrawiam.

48

Są gotowe metody w numpy czy scipy (Który bazuje na numpy :D). Poza tym te metody i tak sortują listę "under the hood", bo inaczej nie miało by to sensu. Pytanie tylko, czy koniecznie potrzebujesz takiego rankingu tzn. nieposortowanego, 1:1 względem oryginalnej listy?

Powyższe można zrobić jednak imo lepiej zrobić to w prosty sposób, który opisałeś.

1

Takie coś?

#pip install numpy

import numpy

lista = [10, 12, 9, 13, 19, 20]
s = numpy.array(lista)
sort_index = [i + 1 for i in numpy.argsort(s)[::-1]]
print(sort_index)

Wyjście: [6, 5, 4, 2, 1, 3]

Kod na podstawie: https://www.geeksforgeeks.org/python-returning-index-of-a-sorted-list/

45

@Konrado777:

@ledi12 Tak potrzebuje 1 do 1 do listy nieposortowanej , Jeśli dana wartość z tej listy będzie odpowiadała danym na innej liście to po sortowaniu traci to sens i wartości nie będą odpowiadać innym danym. Niech będzie druga lista ''lista2 = ['a','b','c','d','e','f']'' Tamte dane odpowiadają elementom z tej listy i jakbym zmienił kolejnych danych z pierwszej listy to nie wiedziałbym ,że 'e' == 6 ranking nie ze względu położenia na pierwszej liście ,ale po kolejności wartości względem listy

Nie wiem co dokładnie próbujesz osiągnąć, ale IMO poleganie 1:1 na indexach brzmi trochę jak złe rozwiązanie a na pewno nie najbardziej optymalne. Równie dobrze możesz ten ranking przetrzymać w dzienniku co da CI znacznie większa swobodę.

ranking = {v:k for k,v in enumerate(sorted(lista, reverse=True), start=1)}

Wtedy, żeby osiągnąć Twój oczekiwany efekt, wystarczy

lista2 = [ranking.get(x) for x in lista]

Jednak nadal nie wiem co próbujesz osiągnąć.

0

@Konrado777:

Twoja lista zwróciła wartości indexów z posortowanej listy ,a nie z orginalnej.

No ale jak to?

Zobacz:

import numpy

lista = [10, 12, 9, 13, 19, 20]
s = numpy.array(lista)
sort_index = numpy.argsort(s)[::-1] + 1
print(sort_index) # [6, 5, 4, 2, 1, 3]
print(lista) # [10, 12, 9, 13, 19, 20]

W komentarzach printów masz napisane, jakie wartości są wypisywane.
Ten kod nie zamienia listy lista na posortowaną, tylko zapisuje kolejność elementów do sort_index.
Numery elementów w kolejności, tak jakby lista była posortowana malejąco.

Gdyby to były wartości indeksów z posortowanej listy, to tak by to wyglądało:
[6, 5, 4, 3, 2, 1] (równie dobrze można by było zrobić odwrócone range...)
a jest
[6, 5, 4, 2, 1, 3]

1 użytkowników online, w tym zalogowanych: 0, gości: 1