masmonkeyss
2019-12-09 00:45
采纳率: 100%
浏览 1.9k

python 无序(不重复)排列组合的问题请教

from itertools import combinations
p = [1, 2, 3, 4, 5] # 产品代码
list_c = [(1, 2), (1, 3)] # 判断条件

list_3 = []
list_4 = []
b = 1

for b in range(1, max(p)):
for c in combinations(p, b + 1):

c_txt = str(c)
print(c_txt)
if c in list_c:
list_3.append(c) # 有效组合
else:
list_4.append(c) # 排除的组合
print(list_4)
print(list_3)

list_3结果:[(1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5), (1, 2, 3), (1, 2, 4)...................]

我希望的效果是 只要带有 list_c 的都排除,就是(1, 2, 3), (1, 2, 4)这些也排除掉,并且生成所有排列的组合2-5位。
(1,2)和(2,1)视为重复。
我想可能是因为 (1, 2, 3) 倍看做为一个元素所有不能排除,但是我想不到用什么方法。
希望有好心人帮帮忙,谢谢!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 吃鸡王者 2019-12-09 09:50
    已采纳
    from itertools import combinations
    p = [1, 2, 3, 4, 5] 
    list_c = [(1, 2), (1, 3)] 
    list_3 = set()
    list_4 = set()
    for b in range(1, max(p)):
        for c  in combinations(p, b + 1):
            list_3.add(c)
            for i in list_c:
                if  set(i).issubset(set(c)):
                    list_4.add(c)
    list_3=list_3-list_4
    print(list_3)          #输出有效组合      
    print(list_4)          #输出排除的组合
    
    
    已采纳该答案
    打赏 评论
  • 空白如空 2019-12-09 09:50
    #coding:UTF-8
    from itertools import combinations
    p = [1, 2, 3, 4, 5] # 产品代码
    list_c = [(1, 2), (1, 3)] # 判断条件
    
    list_3 = []
    list_4 = []
    b = 1
    
    for b in range(1, max(p)):
        for c in combinations(p, b + 1):
            flag = True
            c_txt = str(c)
            for list_c_item in list_c:
                set_c_item = set(list_c_item)
                if set_c_item.issubset(set(c)):
                    list_3.append(c) # 有效组合
                    flag = False
                    break  #符合其中之即可
            if flag:
                list_4.append(c)
    
    print(list_4)
    print(list_3)
    
    打赏 评论
  • JonathanYan 2019-12-09 12:29

    可以考虑用二进制来处理,和楼上的set思路类似:你现在有5个产品,组合对应00001-11111,需要剔除的包括a(11000)和b(10100),用位运算判断就成。
    例如(1,2,4)对应c(11010),(c^a)&a运算结果为00000为零,遂剔除。
    通过二进制生成组合也简单。

    打赏 评论

相关推荐 更多相似问题