我试图生成一个包含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!
我可能错了。
答案 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]