假设我有一个事物列表,它们的频率(按频率排序)和项目总数(为了清楚起见,我在这里使用 dict,但实际上它们是具有频率属性的对象):
items = {"bananas":12, "oranges":12, "apples":11, "pears":2}
现在,我想max_results
从我的 37 ( total_frequency
) 个项目中挑选出 10 个 ( ),但与它们的频率成正比(例如,任何项目中最多 3 个 - max_proportion
)。在这个例子中,我最终会得到 3 个香蕉、橙子和苹果,以及 1 个梨。
def get_relative_quantities(total_frequency, items, max_results, max_proportion):
results = {}
num_added = 0
for freq, the_group in it.groupby(items, lambda x: x.frequency):
if num_added == max_results:
break
the_group_list = list(the_group)
group_size = len(the_group_list)
shuffle(the_group_list)
for item in the_group_list:
if num_added == max_results:
break
rel_freq = min(math.ceil((freq/total_frequency)*max_results), max_proportion)
results[item] = rel_freq
num_added += rel_freq
return results
我担心的一件事是,如果使用这种方法,如果只有 1 个项目,我将无法获得足够的结果。我只会得到 3(假设max_proportion
10 分中有 3 分)。我该如何解决这个问题?