程序从五个单独的列表中找到最小的总和

时间:2014-05-07 16:02:58

标签: python arrays algorithm list

我正在寻找能否抓住如何编码问题的方法,最好是在Python语言中。我想做的是来自5个单独的列表,每个列表中有5个值,找到最小值的总和,其中每个列/行只能使用一次或两次的值。

例如,在以下示例中:

  ! p  ! q  ! r  ! s  ! t !

A !$98 !$96 !$93 !$88 !$86!

B !$76 !$75 !$70 !$68 !$64!

C !$64 !$64 !$66 !$60 !$59!

D !$56 !$55 !$62 !$58 !$57!

E !$50 !$56 !$53 !$48 !$49!

期望的结果是找到最小的总值,其中只有一个p,q,r,s或t可以分配给A,B,C,D或E.即,在p列中不能有2个值两次。 例如,最简单的可能性是:98 + 75 + 66 + 58 + 49 = ...但它必须是可能的最低总值。

我不确定这是用列表或数组做的,还是用它做什么。我非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

from itertools import permutations

data = [
    [98, 96, 93, 88, 86],
    [76, 75, 70, 68, 64],
    [64, 64, 66, 60, 59],
    [56, 55, 62, 58, 57],
    [50, 56, 53, 48, 49]
]

def item_sum(cols):
    return sum(row[col] for row,col in zip(data,cols))

best_cols = min(permutations(range(5)), key=item_sum)
total = item_sum(best_cols)

给出了

best_cols  =>  (4, 3, 2, 1, 0)  =>  [86, 68, 66, 55, 50]
total => 321

答案 1 :(得分:0)

这是一个提示。

给出列表清单:

>>> LoL=[[1,2,3],[4,5,6],[7,8,9]]

您可以使用列表解析来获取各个子列表的总和:

>>> [sum(li) for li in LoL]
[6, 15, 24]

然后,您可以使用min获得最低要求:

>>> min(sum(li) for li in LoL)
6

您可以通过这种方式获取列表索引:

>>> min([(i,sum(li)) for i, li in enumerate(LoL)], key=lambda t: t[1])
(0, 6)

这是解决问题所需要的90%。