假设我有一本看起来像这样的字典:
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。如果heapq的长度大于n,请从队列中弹出最大的元素(最长的距离)并将其丢弃。最后,heapq将保存n个最接近的项目。
或者,您可以只使用列表推导来创建(距离,水果)对的列表,然后对其进行排序,然后取n个最小的条目(在您的情况下为n = 2)。
根据@RoadRunner的建议,另一种选择是创建并存储(计数,水果)元组的排序列表(例如,search_list = sorted([(c, f) for (f, c) in my_dict.items()])
。然后使用bisect模块中的bisect函数来快速查找(x_count,x)属于此列表,然后从该位置向前或向后检查最多2个位置的距离,并为这些候选者创建一个(简短的)(x_count-fruit_count,fruit)对列表,然后对该列表进行排序并取前两项。
我没有提供完整的细节,因为这听起来有点像作业,但希望这会给您一些想法。
关于python - 如何查找最接近给定值的值并返回相应的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48294099/