python - 如何找到最接近给定值的值并返回相应的键

标签 python dictionary

假设我有一本如下所示的字典:

my_dict = {'bananas':'3', 'apples':'10', 'pears':'9', 'grapes':'2', 'oranges':'21', 'peaches':'12'}

我想创建一个函数,当用户输入水果 x 时,返回与水果 x 计数最接近的 2 个水果。

例如,如果用户输入苹果作为 x,该函数将返回梨和桃子。

如果葡萄输入为 x,则将返回香蕉和梨。

从算法上来说,这非常简单。我想知道是否有一种Python式的方法来实现这一点。

最佳答案

我认为你的意思是“概念上”,它非常简单。但你仍然需要想出一个算法来做到这一点。

如果它确实始终是 2 个最接近的元素,那么您可以有 2 个变量来保存迄今为止最接近和第二接近的匹配项。然后迭代字典,对于找到的每个水果,执行以下逻辑:如果比第一个最接近的水果更接近,则将第一个最接近的水果复制到第二个最接近的水果,并将新水果复制到第一个最接近的水果。否则,如果比第二最近的更近,则将新的复制到第二最近的之上。

如果这有可能推广到 n 个最接近的匹配项,那么您可以执行以下操作:创建一个 heapq 来保存 n 个最接近的匹配项。迭代字典。在每一步中,将(距离,水果)元组插入堆中。如果 heapq 的长度大于 n,则将最大元素(距离最长)从队列中弹出并丢弃。最后,heapq 将保存 n 个最接近的项。

或者您可以使用列表理解来创建(距离、水果)对的列表,然后对其进行排序,然后取 n 个最小的条目(在您的情况下 n=2)。

基于@RoadRunner的建议,另一个选项是创建并存储(count,fruit)元组的排序列表(例如,search_list =排序([(c,f)for(f,c)在 my_dict.items()])。然后使用 bisect 模块中的 bisect 函数快速查找 (x_count, x) 属于该列表的位置。然后检查从那里向前或向后最多 2 个位置的距离,为这些候选者创建一个(x_count-fruit_count,水果)对的(简短)列表。然后对该列表进行排序并取出前两项。

我不会提供完整的细节,因为这听起来有点像家庭作业,但希望这会给您一些想法。

关于python - 如何找到最接近给定值的值并返回相应的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48294099/

相关文章:

javascript - 如何在客户端服务器 Web 交互期间执行 Python 代码

python - 为什么这个网络抓取不能在 python 上运行?

json - 将带有多个字典和数组的 JSON 读入 Swift

java - 我们如何对 Map 按值降序排序,然后按键按字母顺序排序?

python - 如何在python中合并具有相同键的嵌套字典

Python:如何将元组值字典写入 csv 文件?

Python 在函数调用中声明变量?

python - 如何在 Python 的同一行打印多行字符串

python - 删除目录下的文件/删除某个不为空的目录

c++ - 无法创建以用户定义类为键的二维 unordered_map