[英]Generating permutations of a unique sequence of positive and negative integers
我有一個數字序列:
[12,10,6,4,2]
這些數字中的每一個都可以是正數或負數。
這告訴我們,對於任何給定的 5 個數字序列,有 2^5 = 32 種可能的方式來排列 + 或 - 符號。
如何生成所有可能的 + 或 - 序列,同時保持這些數字的順序不變?
代碼:
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 萬個排列。 我怎樣才能更快地做到這一點?
您不需要為此進行排列; 符號序列是['+', '-']
的五個副本的笛卡爾積的元素。
>>> values = [12, 10, 6, 4, 2]
>>> from itertools import product
>>> for signs in product('+-', repeat=5):
... t = tuple(zip(signs, values))
... print(t)
...
(('+', 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))
對於大小為 10 的序列,笛卡爾積將有 2 10 = 1,024 個元素,這是完全可行的。
我要賭這個結果格式更容易使用(如果不適合你,那么也許適合其他人)。
>>> for t in product(*((x, -x) for x in values)):
print(t)
(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)
例如,您可以輕松地使用它來計算所有可能的總和:
>>> set(map(sum, product(*((x, -x) for x in values))))
{34, 2, -6, -30, 6, -26, 10, -22, 14, -18, 18, -14, -34, 22, -2, -10, 26, 30}
正如 kaya3 評論的那樣,您甚至可以使用{x, -x}
以便x=0
導致{0}
。 輸入中的每個零然后將輸出元組的數量減半。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.