2016-09-29 2 views
2

Есть простой способ выполнить максимальное K количества ключей: значения пары в этом примереTop-к в списке Dict в питоне

s1 = {'val' : 0} 
s2 = {'val': 10} 
s3 = {'val': 5} 
s4 = {'val' : 4} 
s5 = {'val' : 6} 
s6 = {'val' : 7} 
s7 = {'val' : 3} 
shapelets = [s1,s2,s3,s4,s5,s6,s7] 

Я хочу, чтобы получить максимум 5 чисел в shapelets список, зная, что он содержит ключ имени «val» и которому присвоено значение. Решение здесь заключается в разборе в списке элементов dict и получении максимальных чисел n (в этом случае максимальных значений 5)

Что может быть простым решением, поддерживает ли библиотека операторов в python такую ​​операцию?

+0

По максимальным 5 значениям вы имеете в виду 5 самых больших значений? –

+0

@ Farhan.K да, я хочу, чтобы получить максимальные значения в этом списке. Вещь – f0unix

ответ

2

Вот рабочий пример:

s1 = {'val': 0} 
s2 = {'val': 10} 
s3 = {'val': 5} 
s4 = {'val': 4} 
s5 = {'val': 6} 
s6 = {'val': 7} 
s7 = {'val': 3} 
shapelets = [s1, s2, s3, s4, s5, s6, s7] 

print(sorted(shapelets, key=lambda x: x['val'])[-5:]) 
1

Вы можете использовать heapq:

import heapq 

s1 = {'val': 0} 
s2 = {'val': 10} 
s3 = {'val': 5} 
s4 = {'val': 4} 
s5 = {'val': 6} 
s6 = {'val': 7} 
s7 = {'val': 3} 
shapelets = [s1, s2, s3, s4, s5, s6, s7] 

heapq.nlargest(5,[dct['val'] for dct in shapelets]) 
# [10, 7, 6, 5, 4] 

heapq, вероятно, будет быстрее, чем sorted для больших lists, если вы хотите только некоторые из самых больших значений. Некоторые обсуждения heapq против sorted: here.

+1

Довольно уверен, что nlargest является 'O (n log k)', поэтому он должен быть быстрее, чем сортировать вызовы. –

1

Вы можете сделать это в линейное время с помощью numpy.argpartition:

from operator import itemgetter 
import numpy as np 
arr = np.array(list(map(itemgetter("val"), shapelets))) 

print(arr[np.argpartition(arr, -5)][-5:]) 

В 5 макс значений не обязательно будет в порядке, если вы хотите, что тогда вам нужно будет отсортировать элементы K возвращаемые.

Смежные вопросы