作者bob123 ()
看板Python
標題Re: [問題] 排除輸出重複數值的方法
時間Sun Nov 4 18:21:12 2012
-原文恕刪-
之前有答過類似問題
原文在
#1FYW0hPP (Programming)
我把原po問題分為3個步驟
1. 不同容器,相同物品 的 排列組合
2. 原PO有一個特別限制條件是翻轉一樣的要去掉
3. 每個數字(容器內物品數) <= K (原po設為2)
1)
from itertools import combinations
from numpy import diff
m,n = 9,8 # 改成9樣相同物品給8個相異箱子
c = [ (0,)+i+(m,) for i in combinations(range(1,m),n-1)]
result1 = map(lambda x: tuple(diff(x)),c)
這時result會包含像是(1,1,1,2)及(2,1,1,1)這種對稱的
2)
由於
http://docs.python.org/2/library/itertools.html#itertools.combinations
有說到這邊會是 in sorted order
所以這個result直接取前半段就可以了
from math import ceil
result2 = result1[:int(ceil(len(result1)/2.0))]
3)
最後去掉大於2的數字 (optional)
result3 = filter(lambda x:False not in [i < 3 for i in x],result2)
# result3 為最終結果
寫到這邊忽然看到前面dark版友回兩篇都是重複組合
但是原PO那張圖的需求又讓我覺得怪怪的@@
因為萬一是 4個數字 總和6
像是(1,2,1,2)就不會出現在重複組合裡(因為只會出現(1,1,2,2)這樣)
所以還要再排列一次不是?
通篇廢話不知道有沒有幫到原po就是了~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.104.179.117
※ 編輯: bob123 來自: 59.104.179.117 (11/04 18:23)
※ 編輯: bob123 來自: 59.104.179.117 (11/04 18:29)
※ 編輯: bob123 來自: 59.104.179.117 (11/04 18:30)
推 sofaly:謝謝 作業已順利完成 我當時的需求是 例如1122 11/15 22:01
→ sofaly:1->一個支線 有一個點 2->一個支線 有兩個點 11/15 22:02
→ sofaly:四條支線共交一個圓心點 每條線之間的角度都任意 11/15 22:04
→ sofaly:所以 1122 1221 2211 2112 都是相同的 11/15 22:05
→ sofaly:我用各位的程式 列出所有組合 再用人工篩選 感覺蠻有趣 11/15 22:06
→ sofaly:可以想想像 上面4組都是同一個圖形 但是算起的起點不一樣 11/15 22:09
→ sofaly:再次謝謝各位 沒有你們我作業做不出來 之前有失敗兩次 呵呵 11/15 22:09