如何在Python中生成4个值加起来为1的列表?

时间:2016-02-20 23:04:44

标签: python math permutation

我试图生成一个包含4个值的完整列表,每个值加起来为1.每个值可以增加10%。

例如,

这些是有效列表

[0, 0, 0, 1]
[0.1, 0.8, 0.1, 0]
[0.2, 0.2, 0.2, 0.4]

这些是无效列表

[1, 0.1, 0, 0]
[0.5, 0.5, 0.1, 0]

我相信排列将是

10!/6!我可能错了。

3 个答案:

答案 0 :(得分:2)

这会在三个整数处切割间隔[0,10],为您提供四个子间隔,其长度只需要除以10。

>>> import itertools
>>> for a, b, c in itertools.combinations_with_replacement(range(11), 3):
        print([a/10, (b-a)/10, (c-b)/10, (10-c)/10])

[0.0, 0.0, 0.0, 1.0]
[0.0, 0.0, 0.1, 0.9]
[0.0, 0.0, 0.2, 0.8]
[0.0, 0.0, 0.3, 0.7]
[0.0, 0.0, 0.4, 0.6]
[0.0, 0.0, 0.5, 0.5]
[0.0, 0.0, 0.6, 0.4]
[0.0, 0.0, 0.7, 0.3]
[0.0, 0.0, 0.8, 0.2]
[0.0, 0.0, 0.9, 0.1]
[0.0, 0.0, 1.0, 0.0]
[0.0, 0.1, 0.0, 0.9]
[0.0, 0.1, 0.1, 0.8]
[0.0, 0.1, 0.2, 0.7]
[0.0, 0.1, 0.3, 0.6]
...
...
...
[0.7, 0.2, 0.0, 0.1]
[0.7, 0.2, 0.1, 0.0]
[0.7, 0.3, 0.0, 0.0]
[0.8, 0.0, 0.0, 0.2]
[0.8, 0.0, 0.1, 0.1]
[0.8, 0.0, 0.2, 0.0]
[0.8, 0.1, 0.0, 0.1]
[0.8, 0.1, 0.1, 0.0]
[0.8, 0.2, 0.0, 0.0]
[0.9, 0.0, 0.0, 0.1]
[0.9, 0.0, 0.1, 0.0]
[0.9, 0.1, 0.0, 0.0]
[1.0, 0.0, 0.0, 0.0]

或者更一般(只需用你想要的剪辑数量替换3):

>>> for cuts in itertools.combinations_with_replacement(range(11), 3):
        print([(b-a)/10 for a, b in zip((0,) + cuts, cuts + (10,))])

答案 1 :(得分:1)

您需要的是integer partition。对该术语的网络搜索应该会产生大量的点击。长度为m的n的整数分区只是m个正整数的列表,它们加起来为n。

如果长度为4的整数分区为10,则可以将整数除以10,得到0.1的增量和1的总和。

编辑:我看到列表可能少于4个项目(某些元素可能为零)。所以你正在寻找长度<= 4(不是长度== 4)的整数分区。

答案 2 :(得分:1)

Stefan的解决方案更好,但是,你也可以使用列表理解和itertools库来实现这一点:

import itertools
perm = [[x /10.0 for x in t] for t in itertools.product(range(11), repeat=4) if sum(t)==10]