Python: prendre le max de N éléments de certains de la liste
Est-il une fonction qui m'a le N le plus élevé de certains éléments de la liste?
I. e. si max(l)
renvoie la plus haute de l'élément, les géohelminthiases. comme max(l, count=10)
serait de retour moi une liste des 10 plus grands nombres (ou moins si l
est plus petite).
Ou ce qui pourrait être un efficace moyen facile d'obtenir ces? (À l'exception évidente de la canonique de mise en œuvre; de plus, aucune de ces choses qui impliquent trier la liste dans son ensemble d'abord parce que ce serait inefficace par rapport à la solution canonique.)
- Double Possible de stackoverflow.com/q/1034846/64633
- heapq.nlargest est le chemin à parcourir pour vraiment gros de listes, mais sur mon système, triée(l) [count] est plus rapide, jusqu'à la liste atteint ~25000 éléments.
- triés(l,reverse=True)[0:N]
Vous devez vous connecter pour publier un commentaire.
heapq.nlargest
:La fonction de la bibliothèque standard, qui ne c'est
heapq.nlargest
Commencer par le premier 10 de L, appel de X. Note: la valeur minimale de X.
Boucle sur L[i] pour i sur le reste de L.
Si L[i] est plus grand que min(X), drop min(X) de X et insérer L[i]. Vous pouvez avoir besoin de garder le X comme une liste chaînée triée et faire une insertion. Mise à jour de min(X).
À la fin, vous avez les 10 plus grandes valeurs de X.
Je soupçonne que O(kN) (où k est de 10 ici) car le tri par insertion est linéaire. Peut-être ce que gsl utilise, donc si vous pouvez lire du code C:
http://www.gnu.org/software/gsl/manual/html_node/Selecting-the-k-smallest-or-largest-elements.html
Probablement quelque chose dans numpy qui fait cela.
min
algorithme.)Un assez efficace solution est une variation de quicksort où la récursivité est limitée à la partie droite du pivot jusqu'à ce que le point de pivot de la position est plus élevé que le nombre d'éléments requis (avec quelques conditions supplémentaires pour faire face à la frontière des cas bien sûr).
De la bibliothèque standard a
heapq.nlargest
, comme souligné par d'autres ici.