如何以组合之间的最小偏差计算所有可能的组合

2024-04-25 23:01:52 发布

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

我有3个清单:

a = {1:10,2:12,3:14}
b = {1:5,2:4,3:8}
c = {1:6,2:7,3:3}

现在我可以用itertools获得所有的排列

from itertools import combinations
input = ['a', 'b', 'c', 'd']
output = sum([list(map(list, combinations(input, i))) for i in range(len(input) + 1)], [])

但现在我的问题是“如何计算每个组合的总数量,将a+b+c相加,并获得它们之间的最小偏差?”

它还必须确保没有索引被多次使用

例如,我们可以做:

A1 + B3 + C2 = 10 + 8 + 7 = 25
A2 + B1 + C1 = 12 + 5 + 6 = 23
A3 + B2 + C3 = 14 + 4 + 3 = 21

所以我们可以看到,我们有一个4的偏差(从最高到最低)。我不确定这是否是最好的组合,但它只是为了演示

这个程序应该能够适应更多的价值观

列表“A”永远不会比“B”或“C”大,因为它们有时会比第一个列表多

谢谢你花时间


Tags: infromimportmap列表forinputoutput
1条回答
网友
1楼 · 发布于 2024-04-25 23:01:52

你的问题很不清楚,很难弄清楚你想做什么。我猜你有三组不同的数字,你打算考虑所有可能的三元组,每次从一组中挑选一个数字。然后,您需要计算通过对三元组求和得到的结果的范围

首先,我们用您的字典创建一个列表(注意,在您的问题abc中,字典而不是列表):

In [22]: dicts = [a, b, c]

此列表的大小不限于3。如果你有更多的字典,你可以创建一个更长的列表,例如discts = [a, b, c, d, e, ...]

然后,我们将字典的vlues存储在一个列表中:

In [23]: data = [list(letter.values()) for letter in dicts]

In [24]: data
Out[24]: [[10, 12, 14], [5, 4, 8], [6, 7, 3]]

我们现在准备生成所有可能的三元组和相应的和。为此^{}派上了用场:

In [25]: from itertools import product

In [26]: combos = {triplet: sum(triplet) for triplet in product(*data)}

In [27]: combos
Out[27]: 
{(10, 5, 6): 21,
 (10, 5, 7): 22,
 (10, 5, 3): 18,
 (10, 4, 6): 20,
 (10, 4, 7): 21,
 (10, 4, 3): 17,
 (10, 8, 6): 24,
 (10, 8, 7): 25,
 (10, 8, 3): 21,
 (12, 5, 6): 23,
 (12, 5, 7): 24,
 (12, 5, 3): 20,
 (12, 4, 6): 22,
 (12, 4, 7): 23,
 (12, 4, 3): 19,
 (12, 8, 6): 26,
 (12, 8, 7): 27,
 (12, 8, 3): 23,
 (14, 5, 6): 25,
 (14, 5, 7): 26,
 (14, 5, 3): 22,
 (14, 4, 6): 24,
 (14, 4, 7): 25,
 (14, 4, 3): 21,
 (14, 8, 6): 28,
 (14, 8, 7): 29,
 (14, 8, 3): 25}

最后,结果范围可计算如下:

In [28]: max(combos.values()) - min(combos.values())
Out[28]: 12

旁注:input是Python中的内置函数。不要用input来命名函数或变量

相关问题 更多 >