如何找到我的列表列表的哪些组合使我得到字典中的最大平均值

2024-06-28 10:05:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典D和一个列表D_best。 我想找出我的列表中哪些组合给出了字典值的最大平均值。你知道吗

D = {'Discount': {'D1': 15, 'D2': 26, 'D3': 19, 'D4': 14, 'D5': 20, 'D6': 42}}

D_best = [['D1', 'D6'], ['D3', 'D1']]

组合1=57 D1 + D6

组合2=34 D1 + D3

max(Combination1, Combination2)

retrun最佳组合是[D1, D6]

约束:

  1. 我要从最好的中挑一个
  2. du最好包含任意数量的元素,这里的示例是2,即len(D_best)
  3. D_best内每个元素的长度将保持不变。例如len(D_best[0])将与len(D_best[1])相同

我一直在这样尝试:

D = {'Discount': {'D1': 15, 'D2': 26, 'D3': 19, 'D4': 14, 'D5': 20, 'D6': 42}}

D_best = [['D1', 'D6'], ['D3', 'D1']]

Dlist3 = []
for i in D_best:
    for j in i:
        Dlist3.append(j)
Dlist3 = set(Dlist3)  

disc_dict = {}
for i in Dlist3:
    disc_dict[i] = D['Discount'][i]

print(disc_dict)

c ={}
for n,i in enumerate(D_best):
    ck = ("c{}".format(n))
    c[ck] = i
print(c)

{'D3': 19, 'D1': 15, 'D6': 42}
{'c1': ['D3', 'D1'], 'c0': ['D1', 'D6']}

`


Tags: in列表forlen字典discountdictd2
2条回答

使用itertoolscombination函数,我们首先找出什么是最佳值

from itertools import combinations
from operator import itemgetter as at
k = 2.0
best_val =  max(sum(a)/k for a in combinations(D['Discount'].values(), k))

然后,获取项目的指标:

best_ids = [ tuple(map(at(0), a)) for a in combinations(D['Discount'].items(), k) if sum(map(at(1), a)) == best_val*k]

注意: 我不知道是否只有对夫妇或是三元组和更大的元组也是可能的,你可以迭代k来支持所有可能的大小。你知道吗

为每个组合创建一个列表(组合,求和),在D\U best中:

l = [(comb, sum([D['Discount'][k] for k in comb])) for comb in D_best]
-> [(['D1', 'D6'], 57), (['D3', 'D1'], 34)]

然后取最大值取最好的:

max(l, key=lambda (c,s): s)
-> (['D1', 'D6'], 57)

或者,要仅获取组合而不获取总和,请使用第一个元素:

max(l, key=lambda (c,s): s)[0]
-> ['D1', 'D6']

另一方面:在你的问题中,你要求“最大平均来自字典值”,但在你的例子中,你只是计算总和。只有当组合长度相等(两个值的所有组合)时,这才是相同的。你知道吗

相关问题 更多 >