Python 有序排列permutations,无序组合combinations,阶乘factorial函数

写这篇博客源于博友的提问:将介绍使用Python 进行 有序排列,无序组合排列,阶乘的函数。

1. 问题及解决

问题:
40个球,四个盒子,一个盒子十个球搞排列组合,每个球和盒子都是不可分辨的(没有贴标签或者怎么样),去得到有多少种解法

解决:
不区分球,不区分盒子;相当于是C40,10 * C30,10 * C20,10 * C10,10 * C4,4

用到了有序排列permutations、无序组合combinations、阶乘factorial,幸运的是python封装好了方法。

2. 效果图

在这里插入图片描述

1. 源码

from itertools import combinations, permutations

from math import factorial

# permutations 有序排列
# combinations 无序排列
# factorial 阶乘
print(len(list(permutations([1, 2, 3, 4], 3))), list(permutations([1, 2, 3, 4], 3)))  # 有序排列
print(len(list(combinations([1, 2, 3, 4], 3))), list(combinations([1, 2, 3, 4], 3)))  # 无序排列

# 40个球,四个盒子,一个盒子十个球搞排列组合,每个球和盒子都是不可分辨的(没有贴标签或者怎么样),去得到有多少种解法
ball_list = [i for i in range(1, 41)]  # 1~40
box_list = [i for i in range(1, 5)]  # 1~4

# 不区分球,不区分盒子;
# 相当于是C40,10 * C30,10 * C20,10 *  C10,10 * C4,4
print('共%d种组合' % (factorial(40) / (pow(factorial(10), 4)) * len(list(combinations(box_list, 4)))))

# 每一种放置球的组合方法,下边程序运行电脑会卡,谨慎运行
count = 0
for ball_1 in combinations(ball_list, 10):
    # 第一组球 ball_1
    # 剩下的球
    ball_list_last2 = list(set(ball_list).difference(set(ball_1)))
    for ball_2 in combinations(ball_list_last2, 10):
        # 第2组球 ball_2
        # 剩下的球
        ball_list_last3 = list(set(ball_list_last2).difference(set(ball_2)))
        for ball_3 in combinations(ball_list_last3, 10):
            # 第3组球 ball_3
            # 剩下的球
            ball_4 = list(set(ball_list_last3).difference(set(ball_3)))
            # 第4组球剩10个取10个,只有1种方法不用去排了
            count = count + 1
            print('第%d种组合 %s,%s,%s,%s' % (count, str(ball_1), str(ball_2), str(ball_3), str(ball_4)))
print('共%d种方法' % count)

参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值