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

时间:2017-07-16 12:54:45

标签: python dictionary

我有一个词典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]

约束:

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

    我一直在尝试这种方式:

    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']}
    

    `

2 个答案:

答案 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以支持所有可能的大小。