python字典的优化输出

时间:2012-11-29 18:31:02

标签: python algorithm

我很难解决其中一个编程难题。我有一个字典,其中包含项目(由i#表示)和值作为项目的价格。项目可以组合形成组合包。

{('i2', 'i3'): '4', ('i1',): '1',('i1', 'i3', 'i4'): '6.5', ('i3',): '3',('i1', 'i2', 'i3'): '4.5', ('i2',): '2', ('i4',): '4'}

我想返回给定输入项目的最低价格。如果用户从组合包中获得额外的最低价格,则用户不会有任何问题:

  1. 对于输入i1,它应该返回价格1.(这是所有i1项目的最低价格)
  2. 对于输入(i1,i2),应返回3.
  3. 对于输入(i1,i2,i3,i4),应返回8.5
  4. 对于输入(i1,i1,i2,i3,i4),应返回9.5
  5. 有没有人知道如何处理它?使用哪种算法?

    谢谢, 苏尼

1 个答案:

答案 0 :(得分:2)

使用itertools.combinations()生成x包的组合。然后,检查每个组合是否包含所需项目,并找到价格最低的有效组合。

查找4种不同物品包的所有组合:

d = {('i2', 'i3'): '4', ('i1',): '1',('i1', 'i3', 'i4'): '6.5', ('i3',): '3',
     ('i1', 'i2', 'i3'): '4.5', ('i2',): '2', ('i4',): '4'}
from itertools import combinations
combos = list(combinations(d, 4)) # you should try combos of different lenghts, 
                                  # from 1 to the number of desired items

为了说明,让我们看看其中一个组合。 print combos[0]给出:
 (('i2', 'i3'), ('i1',), ('i1', 'i3', 'i4'), ('i3',))

要获得这个组合的价格:

sum([float(d[item]) for item in combos[0]])

其中14.5

我留给你找到最便宜的合适的组合:)