前言
有1、2、3、4数字能组成多少互不相同无重复数的三位数?
普通写法
这一题很多小伙伴能想到的最直接的方法是嵌套三个for循环,然后判断3个数字不相等,得到组合的情况
代码语言:javascript复制s = 0
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i != j and i != k and j != k:
print(i, j, k)
s = 1
print("总过能生成的排列组合:", s)
这种方式简单粗暴,毫无美感可言,只能算勉强及格。(可能你会说我去百度搜到都是这个答案, 那就不用往下看了!) 如果数据量非常大的时候,是很消耗内存的,于是会想到生成器。
生成器解决
可以定义一个生成器,可以用for循环遍历取值。
代码语言:javascript复制def permutation():
"""
定义一个生成器,函数带yield就是生成器
"""
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i != j and i != k and j != k:
yield "%s%s%s"%(i,j,k)
for i in permutation(): # 遍历
print(i)
# 也可以通过len来求长度
print(len(list(permutation())))
这里虽然用到迭代器的知识了,但上面有3个for循环,依然不太好看。
排列组合
从n个元素的集合中抽取样本容量为r的样本,重复抽样的有序样本数为:
无重复抽样的有序样本数为:
这个理解起来应该是没有难度的,比如有10个人,我现在想选3个人出来拍我马屁:
- 那我先从10个人里随便挑一个,这已经有10种情况了;
- 我再从剩下的的9个人里随便挑一个,又是9种情况;
- 然后我又从剩下的8个人力随便挑一个,又是8种情况;
- 根据乘法原理,一共有10×9×8=720种情况。
迭代工具 itertools
itertools是python内置的模块,使用简单且功能强大,里面有个 permutations 方法就是专门生成排列组合的生成器。
代码语言:javascript复制from itertools import combinations,permutations
# 分别打印每种排列情况
for i, j, k in permutations(['1', '2', '3', '4'], 3):
print(i, j, k)
# 计算总数
print(len(list(permutations(['1', '2', '3', '4'], 3))))
用内置方法就不用自己写生成器了。