我有一个词典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)
重新推出最佳组合[D1, D6]
约束:
len(D_best)
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']}
`
答案 0 :(得分:0)
为D_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']
旁注:在您的问题中,您要求“字典值中的最大平均值”,但在您的示例中,您只需计算总和。如果您的组合具有相同的长度(两个值的所有组合),则这是相同的。
答案 1 :(得分:0)
使用itertools
' combination
功能,首先我们找出最佳价值
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
以支持所有可能的大小。