问题:获取与字典中的最小值对应的键
如果我有Python字典,如何获得包含最小值的条目的键?
我正在考虑与该min()
功能有关的事情…
给定输入:
{320:1, 321:0, 322:3}
它将返回321
。
If I have a Python dictionary, how do I get the key to the entry which contains the minimum value?
I was thinking about something to do with the min()
function…
Given the input:
{320:1, 321:0, 322:3}
It would return 321
.
回答 0
最好:min(d, key=d.get)
-没有理由插入无用的lambda
间接层或提取项目或密钥!
Best: min(d, key=d.get)
— no reason to interpose a useless lambda
indirection layer or extract items or keys!
回答 1
这实际上是提供OP所需解决方案的答案:
>>> 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()
但是,对于较大的词典,使用将更为有效。
Here’s an answer that actually gives the solution the OP asked for:
>>> 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)
Using d.iteritems()
will be more efficient for larger dictionaries, however.
回答 2
对于具有相等最小值的多个键,可以使用列表理解:
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))
For multiple keys which have equal lowest value, you can use a list comprehension:
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]
An equivalent functional version:
res = list(filter(lambda x: d[x]==minval, d))
回答 3
min(d.items(), key=lambda x: x[1])[0]
min(d.items(), key=lambda x: x[1])[0]
回答 4
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k])
321
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k])
321
回答 5
对于您有多个最小键并希望保持简单的情况
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']
For the case where you have multiple minimal keys and want to keep it simple
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']
回答 6
如果您不确定是否没有多个最小值,我建议:
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
"""
If you are not sure that you have not multiple minimum values, I would suggest:
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
"""
回答 7
编辑:这是OP 关于最小密钥而不是最小答案的原始问题的答案。
您可以使用keys
函数获取字典的键,并且正确使用min
来查找该列表的最小值。
Edit: this is an answer to the OP’s original question about the minimal key, not the minimal answer.
You can get the keys of the dict using the keys
function, and you’re right about using min
to find the minimum of that list.
回答 8
解决具有相同最小值的多个键的另一种方法:
>>> 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]
Another approach to addressing the issue of multiple keys with the same min value:
>>> 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]
回答 9
使用min
与迭代器(对于Python 3使用items
代替iteritems
); 代替lambda使用itemgetter
from运算符,它比lambda更快。
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
Use min
with an iterator (for python 3 use items
instead of iteritems
); instead of lambda use the itemgetter
from operator, which is faster than lambda.
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
回答 10
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]
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]
回答 11
我比较了以下三个选项的执行情况:
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
I compared how the following three options perform:
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 )
Sample output:
#option 1
236230
0:00:14.136808
#option 2
236230
0:00:00.458026
#option 3
236230
0:00:00.824048
回答 12
要创建可排序的类,您必须重写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]))
这对我有用。
to create an orderable class you have to override 6 special functions, so that it would be called by the min() function
these methods are__lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
in order they are less than, less than or equal, greater than, greater than or equal, equal, not equal.
for example you should implement __lt__
as follows:
def __lt__(self, other):
return self.comparable_value < other.comparable_value
then you can use the min function as follows:
minValue = min(yourList, key=(lambda k: yourList[k]))
this worked for me.
回答 13
min(zip(d.values(), d.keys()))[1]
使用zip函数创建包含值和键的元组的迭代器。然后用min函数包装它,min函数根据第一个键取最小值。这将返回一个包含(值,键)对的元组。索引[1]用于获取对应的密钥
min(zip(d.values(), d.keys()))[1]
Use the zip function to create an iterator of tuples containing values
and keys. Then wrap it with a min function which takes the minimum based
on the first key. This returns a tuple containing (value, key) pair. The index of [1] is used to get the corresponding key
回答 14
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
回答 15
这是你想要的?
d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'
print d[min(d.keys())]
打印“十四”
Is this what you are looking for?
d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'
print d[min(d.keys())]
Prints ‘fourteen’