Cómo encontrar los valores más altos primero, segundo, tercero en una lista en Python

Sé cómo encontrar el primer valor más alto, pero no sé el rest. Tenga en cuenta que necesito imprimir la posición del 1º, 2º y 3º valor más alto. Gracias e intente que sea sencillo, ya que solo he estado progtwigndo durante 2 meses. También pueden ser rangos conjuntos.

def linearSearch(Fscore_list): pos_list = [] target = (max(Fscore_list)) for i in range(len(Fscore_list)): if Fscore_list[i] >= target: pos_list.append(i) return pos_list 

Esto imprimirá una lista de los 3 elementos más altos, cada uno emparejado con su índice:

 lst = [9,7,43,2,4,7,8,5,4] print( sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )[:3] ) 

Las cosas son un poco más complicadas si el mismo valor puede aparecer varias veces (esto mostrará la posición más alta para un valor):

 lst = [9,7,43,2,4,7,8,5,4] ranks = sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True ) values = [] posns = [] for x,i in ranks: if x not in values: values.append( x ) posns.append( i ) if len(values) == 3: break print zip( values, posns ) 

Utilice heapq.nlargest

 >>> import heapq >>> [i ... for x, i ... in heapq.nlargest( ... 3, ... ((x, i) for i, x in enumerate((0,5,8,7,2,4,3,9,1))))] [7, 2, 3] 

Agregue todos los valores de la lista a un conjunto. Esto asegurará que usted tenga cada valor solo una vez.

Ordenar el conjunto.

Encuentre el índice de los tres valores principales en el conjunto en la lista original.

¿Tener sentido?

Editar

 thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8] theset = frozenset(thelist) theset = sorted(theset, reverse=True) print('1st = ' + str(theset[0]) + ' at ' + str(thelist.index(theset[0]))) print('2nd = ' + str(theset[1]) + ' at ' + str(thelist.index(theset[1]))) print('3rd = ' + str(theset[2]) + ' at ' + str(thelist.index(theset[2]))) 

Editar

Aún no nos ha dicho cómo manejar a los ‘ganadores conjuntos’, pero al ver sus respuestas a otras respuestas, supongo que esto podría ser lo que está tratando de hacer, ¿quizás? Si esta no es la salida que desea, por favor dénos un ejemplo de la salida que espera obtener.

 thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8] theset = frozenset(thelist) theset = sorted(theset, reverse=True) thedict = {} for j in range(3): positions = [i for i, x in enumerate(thelist) if x == theset[j]] thedict[theset[j]] = positions print('1st = ' + str(theset[0]) + ' at ' + str(thedict.get(theset[0]))) print('2nd = ' + str(theset[1]) + ' at ' + str(thedict.get(theset[1]))) print('3rd = ' + str(theset[2]) + ' at ' + str(thedict.get(theset[2]))) 

Salida

 1st = 103 at [8, 9] 2nd = 88 at [2, 5] 3rd = 45 at [1, 4] 

BTW: ¿Qué sucede si todos los valores son iguales (el mismo primero) o por algún otro motivo no hay un tercer lugar? (o segundo lugar?). ¿Necesitas protegerte contra eso? Si lo hace, estoy seguro de que puede elaborar protecciones de seguridad adecuadas para agregar al código.

Hay un algoritmo O (n) complicado, pero la forma más sencilla es ordenarlo, que es O (n * log n), luego tomar el control. La parte más complicada aquí es ordenar los datos mientras se mantiene la información de los índices.

 from operator import itemgetter def find_top_n_indices(data, top=3): indexed = enumerate(data) # create pairs [(0, v1), (1, v2)...] sorted_data = sorted(indexed, key=itemgetter(1), # sort pairs by value reversed=True) # in reversed order return [d[0] for d in sorted_data[:top]] # take first N indices data = [5, 3, 6, 3, 7, 8, 2, 7, 9, 1] print find_top_n_indices(data) # should be [8, 5, 4] 

De manera similar, se puede hacer con heapq.nlargest() , pero aún así necesita empaquetar los datos iniciales en tuplas y desempaquetarlos después.

Para tener una lista filtrada y devuelta en orden descendente con duplicados eliminados intente usar esta función. Puede pasar cuántos valores descendentes desea que devuelvan como argumento de palabra clave.

También una nota al margen, si el argumento de la palabra clave (order_nums_to_return) es mayor que la longitud de la lista, devolverá la lista completa en orden descendente. Si lo necesita para generar una excepción, puede agregar una verificación a la función. Si no se pasa ningún argumento, devolverá el valor más alto, de nuevo, puede cambiar este comportamiento si lo necesita.

 list_of_nums = [2, 4, 23, 7, 4, 1] def find_highest_values(list_to_search, ordered_nums_to_return=None): if ordered_nums_to_return: return sorted(set(list_to_search), reverse=True)[0:ordered_nums_to_return] return [sorted(list_to_search, reverse=True)[0]] print find_highest_values(list_of_nums, ordered_nums_to_return=4) 

Si los valores pueden aparecer en su lista repetidamente, puede probar esta solución.

 def search(Fscore_list, num=3): l = Fscore_list res = dict([(v, []) for v in sorted(set(l), reverse=True)[:num]]) for index, val in enumerate(l): if val in res: res[val].append(index) return sorted(res.items(), key=lambda x: x[0], reverse=True) 

Primero encuentra num=3 valores más altos y crea un dict con una list vacía para los índices para él. A continuación, recorre la lista y, para cada uno de los valores más altos (valores val in res ), guarde sus índices. Luego simplemente devuelva la lista ordenada de tuplas como [(highest_1, [indexes ...]), ..] . p.ej

 >>> l = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4] >>> print(search(l)) [(43, [2, 6]), (9, [0]), (8, [7, 9])] 

Para imprimir las posiciones haz algo como:

 >>> Fscore_list = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4, 43, 43, 43] >>> result = search(Fscore_list) >>> print("1st. %d on positions %s" % (result[0][0], result[0][1])) 1st. 43 on positions [2, 6, 11, 12, 13] >>> print("2nd. %d on positions %s" % (result[1][0], result[1][1])) 2nd. 9 on positions [0] >>> print("3rd. %d on positions %s" % (result[2][0], result[2][1])) 3rd. 8 on positions [7, 9] 

None siempre se considera más pequeño que cualquier número.

 >>> None<4 True >>> None>4 False 

Encuentra el elemento más alto, y su índice. Reemplácelo por None . Encuentra el nuevo elemento más alto, y su índice. Este sería el segundo más alto en la lista original. Reemplácelo por None . Encuentra el nuevo elemento más alto, que en realidad es el tercero.

Opcional: restaurar los elementos encontrados a la lista.

Esto es O (número de elementos más altos * tamaño de la lista), por lo que se escala de manera deficiente si sus “tres” crecen, pero en este momento es O (3n).

Comience por ordenar la lista en orden descendente:

 my_list = [1, 2, 8, 4, 7, 6, 5, 3] sorted_list = sorted(my_list, reverse=True) print(sorted_list) 

Salida:

 [8, 7, 6, 5, 4, 3, 2, 1] 

A continuación, puede extraer el índice de los tres elementos más grandes (los primeros 3 elementos de la lista sorted_list ) de la siguiente manera:

 index_of_highest = my_list.index(sorted_list[0]) index_of_second_highest = my_list.index(sorted_list[1]) index_of_third_highest = my_list.index(sorted_list[2])