4选3不重复问题,用1句话搞定,潘石屹微

北京湿疹医院那里好 http://pf.39.net/xwdt/210706/9150611.html

今天,我们从一个简单的案例来入手,分析一下Python中哪些鲜为人知的组合问题。老潘的博客里可没这些内容哦,大家千万不要错过。

老潘学Python

01一个简单的例子

有四个数字: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(


转载请注明:http://www.aierlanlan.com/rzfs/4653.html