作者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)
1F:推 sofaly:谢谢 作业已顺利完成 我当时的需求是 例如1122 11/15 22:01
2F:→ sofaly:1->一个支线 有一个点 2->一个支线 有两个点 11/15 22:02
3F:→ sofaly:四条支线共交一个圆心点 每条线之间的角度都任意 11/15 22:04
4F:→ sofaly:所以 1122 1221 2211 2112 都是相同的 11/15 22:05
5F:→ sofaly:我用各位的程式 列出所有组合 再用人工筛选 感觉蛮有趣 11/15 22:06
6F:→ sofaly:可以想想像 上面4组都是同一个图形 但是算起的起点不一样 11/15 22:09
7F:→ sofaly:再次谢谢各位 没有你们我作业做不出来 之前有失败两次 呵呵 11/15 22:09