Return 特定数字之间的最高键值对

Return highest key value pair in-between certain number

我正在使用图像扫描 API 来查找特定图像,即猫或狗,此 API 告诉您图像中结果的概率。例如,狗的图像会 return

{u'dog': 0.99628395, u'cat': 0.87454434}

我希望我的最终结果只取最高的 returned 值,并且仅当它高于 .89 且低于 1 时。

我目前拥有的代码:

import operator

#define lists
tags = [u'dog', u'cat']
tags_value= [0.99628395, 0.87454434]

#merge key and value pairs
keywords = dict(zip(tags, tags_value))

#check the result
print (keywords)

这给了我

{u'dog': 0.99628395, u'cat': 0.87454434}

我正在寻找

的最终结果

[u'dog']

(注意最终结果如何在 [] 而不是 {} 中)

注意:如果最终结果是 {u'dog': 0.88628395, u'cat': 0.87454434} 那么我不想 return 任何东西因为该值小于 .89

有两个步骤:

要获取具有字典最大值的键,您可以这样做best = max(keywords, key=keywords.get)。这将获取字典的最大值,因为它使用键来获取字典中每个项目的值。

然后您可以简单地检查它是否在您的范围内:return best if .89 < keywords[best] < 1 else []。如果值不在 .89 和 1

之间,这将 return 一个空数组

已更新

为了效率(来自@Mad Physicist 的评论),您可以取最大元素并检查它是否在预期范围内。

data = {u'dog': 0.99628395, u'cat': 0.87454434}
probable_key = max(data, key = data.get)
result = None
if 0.89<data[probable_key] and data[probable_key]<1:
    result = probable_key
print(result) # dog

您还可以根据字典的值对字典进行排序,然后检查该值是否在预期范围内。

import operator
data = {u'dog': 0.99628395, u'cat': 0.87454434}

sorted_data = sorted(data.items(), key = operator.itemgetter(1), reverse=True)
result = None
if 0.89<sorted_data[0][1] and sorted_data[0][1]<1:
    result = sorted_data[0][0]
print(result) # dog
max((k for k, v in keywords.items() if .89 < v < 1), default=None, key=keywords.get)
# 'dog'
  • 第一个参数过滤字典中满足条件的项目,即.89 < v < 1
  • 第二个参数是一个默认值,如果没有项目满足条件,例如{u'dog': 0.88628395, u'cat': 0.87454434} -> None.
  • 最后一个参数是一个关键函数,它将 max() 应用于原始字典的值。

答案 1(更多 pythonic):

res = [ key for key, val in keywords.items() if ( (val == max(list(keywords.values()))) and (0.89 <= val) and (val <= 1) ) ]
print (res)

回答2(更多"granular"):

keys = list(keywords.keys())
values = list(keywords.values())
print( keys, values )
max_value = max(values)
max_index = values.index(max_value)
max_key = keys[max_index]
res = []
if ( (0.89 <= max_value) and (max_value <= 1) ) :
    res.append(max_key)
print (res)

根据我的测试,选项 1 大约是。快 25%(5.3us 对比 6.9us)。

您可以将项目转换为元组格式,然后使用 max ,元组始终按其第一项进行比较:

sample={u'dog': 0.99628395, u'cat': 0.87454434}
print(max([(j,i) for i,j in sample.items() if j>0.89 and j<1]))

输出:

(0.99628395, 'dog')