Como si creo un diccionario usando el siguiente script:

r_lst = {}
for z in df.index:
  t = x.loc[0, 'sn']
  s = df.loc[z, 'rv']
  slope, intercept, r_value, p_value, std_err = stats.linregress(t,s)
  r_lst.setdefault(float(z),[]).append(float(r_value))

El diccionario resultante se asemeja a este

{4050.32: [0.29174641574734467],
 4208.98: [0.20938901991887324],
 4374.94: [0.2812420188097632],
 4379.74: [0.28958742731611586],
 4398.01: [0.3309140298947313],
 4502.21: [0.28702220304639836],
 4508.28: [0.2170363811575936],
 4512.99: [0.29080133884942105]}

Ahora, si quiero encontrar los valores más pequeños o más grandes del diccionario, entonces solo tengo que usar este comando simple min(r_lst.values()) o max(r_lst.values()).

¿Qué pasa si quiero los tres valores más bajos o los tres valores más altos? Entonces, ¿cómo puedo conseguir eso? Vi algunas preguntas aquí, pero ninguna de ellas responde a lo que estoy pidiendo.

2
astroluv 15 oct. 2018 a las 20:04

2 respuestas

La mejor respuesta

Simplemente use sorted():

sorted(r_lst.values())

O en orden inverso:

sorted(r_lst.values(), reverse=True)

Entonces, para obtener los 3 valores más grandes:

sorted(r_lst.values(), reverse=True)[:3]

Rendimientos:

[[0.3309140298947313], [0.29174641574734467], [0.29080133884942105]]
2
rahlf23 15 oct. 2018 a las 17:09

Puede utilizar heapq.nsmallest / heapq.nlargest:

import heapq

res = heapq.nsmallest(3, d.values())

# [[0.20938901991887324], [0.2170363811575936], [0.2812420188097632]]

Para extraer como una lista plana, puede usar {{X0} }:

from itertools import chain
import heapq

res = list(chain.from_iterable(heapq.nsmallest(3, d.values())))

# [0.20938901991887324, 0.2170363811575936, 0.2812420188097632]

Estas soluciones heapq tendrán una complejidad de tiempo O (( n - k ) * log n ) versus O ( n log n ) para soluciones que requieren una clasificación completa.

1
jpp 15 oct. 2018 a las 17:09