假设我有一本如下所示的字典:
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/