我有一系列数字:
[12,10,6,4,2]
这些数字可以是正的,也可以是负的
这告诉我们有2^5=32种可能的方法,我们可以为任何给定的5个数字序列排列+或-符号
如何生成所有可能的+或-for序列,同时保持这些数字的顺序不变
代码:
combs = itertools.permutations('+++++-----', 5)
combs = list(combs)
values = [12,10,6,4,2]
broadcasted = [tuple(zip(i,values)) for i in combs]
test = set()
for item in broadcasted:
test.add(item)
print(len(test))
print(test)
输出:
32
{(('+', 12), ('+', 10), ('-', 6), ('+', 4), ('+', 2)),
(('+', 12), ('+', 10), ('+', 6), ('-', 4), ('+', 2)),
(('+', 12), ('+', 10), ('+', 6), ('+', 4), ('+', 2)),
(('+', 12), ('+', 10), ('-', 6), ('-', 4), ('+', 2)),
(('-', 12), ('+', 10), ('+', 6), ('+', 4), ('-', 2)),
(('-', 12), ('+', 10), ('-', 6), ('-', 4), ('-', 2)),
(('+', 12), ('+', 10), ('+', 6), ('-', 4), ('-', 2)),
(('+', 12), ('+', 10), ('-', 6), ('+', 4), ('-', 2)),
(('-', 12), ('+', 10), ('+', 6), ('-', 4), ('-', 2)),
(('-', 12), ('+', 10), ('-', 6), ('+', 4), ('-', 2)),
(('+', 12), ('-', 10), ('+', 6), ('-', 4), ('+', 2)),
(('-', 12), ('+', 10), ('+', 6), ('-', 4), ('+', 2)),
(('-', 12), ('+', 10), ('-', 6), ('+', 4), ('+', 2)),
(('-', 12), ('-', 10), ('+', 6), ('+', 4), ('-', 2)),
(('-', 12), ('-', 10), ('-', 6), ('-', 4), ('-', 2)),
(('+', 12), ('-', 10), ('+', 6), ('+', 4), ('-', 2)),
(('-', 12), ('-', 10), ('+', 6), ('-', 4), ('+', 2)),
(('-', 12), ('-', 10), ('-', 6), ('+', 4), ('+', 2)),
(('-', 12), ('-', 10), ('+', 6), ('+', 4), ('+', 2)),
(('-', 12), ('-', 10), ('-', 6), ('-', 4), ('+', 2)),
(('+', 12), ('-', 10), ('-', 6), ('+', 4), ('-', 2)),
(('+', 12), ('-', 10), ('+', 6), ('-', 4), ('-', 2)),
(('-', 12), ('-', 10), ('+', 6), ('-', 4), ('-', 2)),
(('-', 12), ('-', 10), ('-', 6), ('+', 4), ('-', 2)),
(('+', 12), ('+', 10), ('+', 6), ('+', 4), ('-', 2)),
(('+', 12), ('+', 10), ('-', 6), ('-', 4), ('-', 2)),
(('-', 12), ('+', 10), ('+', 6), ('+', 4), ('+', 2)),
(('-', 12), ('+', 10), ('-', 6), ('-', 4), ('+', 2)),
(('+', 12), ('-', 10), ('+', 6), ('+', 4), ('+', 2)),
(('+', 12), ('-', 10), ('-', 6), ('-', 4), ('+', 2)),
(('+', 12), ('-', 10), ('-', 6), ('+', 4), ('+', 2)),
(('+', 12), ('-', 10), ('-', 6), ('-', 4), ('-', 2))}
虽然它可以获取所有选项的序列(即5'+'和5'-),以5的序列排列它们,将它们广播到给定的数字,并在一个集合中进行浓缩,但对于10的序列来说,它的计算量太大,需要我们构造300多万个排列。我怎样才能做得更快
你不需要为此进行排列;符号序列是
['+', '-']
的五个副本的Cartesian product的元素对于大小为10的序列,笛卡尔乘积将有2个10=1024个元素,这是完全可行的
我要赌这个结果格式更容易使用(如果不是为你,那么可能是为其他人)
例如,您可以轻松地使用它计算所有可能的总和:
正如kaya3所评论的,您甚至可以使用
{x, -x}
,以便x=0
导致{0}
。输入中的每一个零将使输出元组的数量减半相关问题 更多 >
编程相关推荐