物事のリスト、それらの頻度(頻度でソート)、およびアイテムの総数があるとしましょう(ここではわかりやすくするために辞書を使用していますが、実際には頻度プロパティを持つオブジェクトです)。
items = {"bananas":12, "oranges":12, "apples":11, "pears":2}
max_results
今、私は私の37( )アイテムから10アイテム()を選びたいと思いますtotal_frequency
が、それらの頻度に比例します(たとえば、任意のアイテムの最大で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つは、このアプローチでは、アイテムが1つしかない場合、十分な結果が得られないことです。私はちょうど3を取得します(max_proportion
10のうちf 3を想定)。どうすればその問題に取り組むことができますか?