今天,我们从一个简单的案例来入手,分析一下Python中哪些鲜为人知的组合问题。老潘的博客里可没这些内容哦,大家千万不要错过。
老潘学Python01一个简单的例子
有四个数字:1、2、3、4,它们能组成多少个互不相同且无重复数字的三位数?各是多少?如何解决这个问题呢?
如何解决这一问题呢?很简单,入门级的知识,源代码如下:
程序实现输出如下:
[[1,2,3],[1,2,4],[1,3,2],[1,3,4],[1,4,2],[1,4,3],[2,1,3],[2,1,4],[2,3,1],[2,3,4],[2,4,1],[2,4,3],[3,1,2],[3,1,4],[3,2,1],[3,2,4],[3,4,1],[3,4,2],[4,1,2],[4,1,3],[4,2,1],[4,2,3],[4,3,1],[4,3,2]]
一共24中组合。怎么样?是不是很简单,但是,我们今天要讲的不是这个。有没有更加pythonic的方法呢?
选3问题用一句话搞定
上面这个问题看起来很直观,但是有没有更加Python化的表示方法呢?当然有,看下面(复制的时候把感叹号换成英文即可):
g=([i,j,k]foriinrange(1,5)forjinrange(1,5)forkinrange(1,5)if(i!=k)and(i!=j)and(j!=k))
一句话的事这个g就是我们生成的迭代器咯,对于迭代器的用法,我们之前也讨论过,并且通过一个案例展示了它的用法:
有了它,出门旅游再也不怕感冒了,Python使用迭代器进行天气预报
来看下这句话能够解决我们的问题:
foriing:print(i,end=")
[1,2,3],[1,2,4],[1,3,2],[1,3,4],[1,4,2],[1,4,3],[2,1,3],[2,1,4],[2,3,1],[2,3,4],[2,4,1],[2,4,3],[3,1,2],[3,1,4],[3,2,1],[3,2,4],[3,4,1],[3,4,2],[4,1,2],[4,1,3],[4,2,1],[4,2,3],[4,3,1],[4,3,2],
同样完美解决。但是,大家都知道,这种一句话的方式可读性并不好。
不只是4选3的问题等等,问题虽然解决了,但是我们没有从更深层次讨论这个问题,这一问题的本质是什么?
03这是个什么样的问题?
简单来讲,这是个组合问题。即:从4个数中找出3个数的不重复组合。那么,问题来了,如果我们有n个数,需要从n个数字中找出不重复的m个数字的组合,这样的组合如何输出呢?
理清思路很重要理一下思路,分下面三种情况:
当m=1时,组合就是n个数中的单个元素组合;当m=n时,组合就是这n个数的组合;当mn时,我们分两种情况判断:首先,从n个数组成的列表N中选出第一个元素,然后在列表N中剩余的n-1个元素中选出不重复的m-1个数。这样,列表N中第一个元素和这m-1个不重复的数据就组成m个不重复的元素;当然,还可以从n-1个元素(列表N中除第一个元素外的元素)中单独找出m个这样的不重复组合;依次改变列表,重复操作(将第一个元素移到列表N尾部,生成新列表)第3步中我们其实获得的是列表的所有元素组合,里面还有重复元素的,往下看。我们用程序来实现上述过程。
列表N选m个不重复元素的组合我们来看下这样输出的结果如何:
print(