Якщо у мене є словник Python, як мені отримати ключ до запису, який містить мінімальне значення?
Я думав про щось, що стосується min()
функції ...
З огляду на вхід:
{320:1, 321:0, 322:3}
Це повернеться 321
.
Якщо у мене є словник Python, як мені отримати ключ до запису, який містить мінімальне значення?
Я думав про щось, що стосується min()
функції ...
З огляду на вхід:
{320:1, 321:0, 322:3}
Це повернеться 321
.
Відповіді:
Найкраще: min(d, key=d.get)
- немає причин вставляти марний lambda
шар непрямості або витягувати предмети чи ключі!
[11, 22, 33]
, замість словника, наприклад {1: 11, 2:22, 3:33}
. 'd.get' дійсний для словника, але не для списку.
d={"a":[10, None], "b":[20, None]}
де min обчислюється від d [ключ] [0]?
min()
повернути значення в першому значенні в сортованому. ключ позначає спосіб сортування значень. key=d.get
означає, що список буде відсортований за значеннями словника.
Ось відповідь, яка насправді дає рішення, про яке попросила ОП:
>>> d = {320:1, 321:0, 322:3}
>>> d.items()
[(320, 1), (321, 0), (322, 3)]
>>> # find the minimum by comparing the second element of each tuple
>>> min(d.items(), key=lambda x: x[1])
(321, 0)
d.iteritems()
Однак використання буде більш ефективним для більших словників.
operator.itemgetter(1)
.
Для декількох ключів, які мають однакове найменше значення, ви можете використовувати розуміння списку:
d = {320:1, 321:0, 322:3, 323:0}
minval = min(d.values())
res = [k for k, v in d.items() if v==minval]
[321, 323]
Еквівалентна функціональна версія:
res = list(filter(lambda x: d[x]==minval, d))
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k])
321
key=d.get
краще.
У випадку, коли у вас є кілька мінімальних ключів, і ви хочете, щоб це було просто
def minimums(some_dict):
positions = [] # output variable
min_value = float("inf")
for k, v in some_dict.items():
if v == min_value:
positions.append(k)
if v < min_value:
min_value = v
positions = [] # output variable
positions.append(k)
return positions
minimums({'a':1, 'b':2, 'c':-1, 'd':0, 'e':-1})
['e', 'c']
Якщо ви не впевнені, що у вас немає декількох мінімальних значень, я б запропонував:
d = {320:1, 321:0, 322:3, 323:0}
print ', '.join(str(key) for min_value in (min(d.values()),) for key in d if d[key]==min_value)
"""Output:
321, 323
"""
Редагувати: це відповідь на початкове запитання ОП щодо мінімального ключа, а не мінімальної відповіді.
Ви можете отримати ключі диктату за допомогою keys
функції, і ви маєте рацію використовувати min
мінімум цього списку.
Ще один підхід до вирішення проблеми декількох ключів з однаковим мінімальним значенням:
>>> dd = {320:1, 321:0, 322:3, 323:0}
>>>
>>> from itertools import groupby
>>> from operator import itemgetter
>>>
>>> print [v for k,v in groupby(sorted((v,k) for k,v in dd.iteritems()), key=itemgetter(0)).next()[1]]
[321, 323]
Використовуйте min
з ітератором (для використання python 3 items
замість iteritems
); замість лямбда використовувати itemgetter
оператор від оператора, який швидше, ніж лямбда.
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
d={}
d[320]=1
d[321]=0
d[322]=3
value = min(d.values())
for k in d.keys():
if d[k] == value:
print k,d[k]
Я порівняв ефективність наступних трьох варіантів:
import random, datetime
myDict = {}
for i in range( 10000000 ):
myDict[ i ] = random.randint( 0, 10000000 )
# OPTION 1
start = datetime.datetime.now()
sorted = []
for i in myDict:
sorted.append( ( i, myDict[ i ] ) )
sorted.sort( key = lambda x: x[1] )
print( sorted[0][0] )
end = datetime.datetime.now()
print( end - start )
# OPTION 2
start = datetime.datetime.now()
myDict_values = list( myDict.values() )
myDict_keys = list( myDict.keys() )
min_value = min( myDict_values )
print( myDict_keys[ myDict_values.index( min_value ) ] )
end = datetime.datetime.now()
print( end - start )
# OPTION 3
start = datetime.datetime.now()
print( min( myDict, key=myDict.get ) )
end = datetime.datetime.now()
print( end - start )
Вибірка зразка:
#option 1
236230
0:00:14.136808
#option 2
236230
0:00:00.458026
#option 3
236230
0:00:00.824048
щоб створити упорядкований клас, ви повинні перекрити 6 спеціальних функцій, щоб його викликали функцією min ()
ці методи є __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
для того, щоб вони були меншими, меншими або рівними, більшими, більшими або рівними, рівними, не рівними. наприклад, вам слід реалізувати __lt__
наступне:
def __lt__(self, other):
return self.comparable_value < other.comparable_value
то ви можете використовувати функцію min наступним чином:
minValue = min(yourList, key=(lambda k: yourList[k]))
це працювало для мене.
min(zip(d.values(), d.keys()))[1]
Використовуйте функцію zip, щоб створити ітератор кортежів, що містять значення та ключі. Потім оберніть його функцією min, яка приймає мінімум на основі першої клавіші. Це повертає кортеж, що містить пару (значення, ключ). Індекс [1] використовується для отримання відповідного ключа
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
min()
).
Це те, що ви шукаєте?
d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'
print d[min(d.keys())]
Друкує «чотирнадцять»