2016-11-24 4 views
2
number = 2 
dct = {'a': 5,'b': 3,'c': 4} 

for key,value in dct.items(): 

Я хочу проверить значения, которые являются самыми большими в словаре. Проверка зависит от количества, поэтому в этом случае необходимо вернуть номер {'a':5, 'c':4}, так как номер 2. Однако, если число было 1, необходимо вернуть только {'a':5}. Я не могу импортировать или использовать лямбдаПолучить n наибольший ключ, значение в словаре

ответ

2

Без импорта вы можете сделать это следующим образом:

>>> n = 2 
>>> mydict = {'a': 5, 'b': 3, 'c': 4} 
>>> {key: mydict[key] for key in sorted(mydict, key=mydict.get, reverse=True)[:n]} 
{'a': 5, 'c': 4} 

список понимание является эквивалентом из этого:

result = {} 
for key in sorted(mydict, key=mydict.get, reverse=True)[:n]: 
    result.update({key: mydict[key]}) 

Если несколько ключей имеют одинаковое значение, и вы хотите разбить правило n наибольшее, вам необходимо использовать set.

>>> mydict = {'a': 5, 'b': 3, 'c': 4, 'd': 4} 
>>> {key: value for key, value in mydict.items() if value in sorted(set(mydict.values()), reverse=True)[:2]} 
{'a': 5, 'c': 4, 'd': 4} 

Вы также можете получить nlargestdict.values() и связанные с ним ключи, используя Dict понимание.

>>> import heapq 
>>> n = 2 
>>> mydict = {'a': 5, 'b': 3, 'c': 4} 
>>> {key: value for key, value in mydict.items() if value in heapq.nlargest(n, mydict.values())} 
{'a': 5, 'c': 4} 
+0

Мне нравится ваш путь, но я не хочу его в одной строке – CAVS

+0

@ КАВС счастлив сейчас? :) – styvane

+0

Что делать, если у меня есть несколько ключей с высокими значениями? mydict = {'a': 5, 'b': 3, 'c': 4, 'd': 4}, а число равно 2, я хочу получить {'a': 5, 'c': 4 , 'd': 4} – CAVS

1
import heapq 
number = 2 
d={'a':5,'b':3,'c':4} 
maximums = {k: d[k] for k in heapq.nlargest(number, d, key=lambda k: d[k])} 

UPDATE: Без лямбды и импорта

number = 2 
d={'a':5,'b':3,'c':4} 
{i[1]:i[0] for i in sorted(zip(d.values(), d.keys()), reverse=True)[:number]} 
+0

Я не могу импортировать или использовать лямбда – CAVS

0

Смотрите мой ответ

>>> number = 2 
>>> dct = {'a': 5,'b': 3,'c': 4} 
>>> lst = sorted([value for value in dct.values()], 
       reverse=True)[:number] 
>>> result = {k: v for k, v in dct.items() if v in lst} 
>>> result 
{'a': 5, 'c': 4} 

В lst, вы получите список dctзначений в порядке, какой индекс находится ниже number убывания.

>>> lst 
[5, 4] 

Затем dct фильтруют, значение которого находится в lst.

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