# 实例001:数字组合 # 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
环境:Pycharm2022 + Anaconda3
先用数学排列组合分析再用Python实现 并进行方法总结
目录
首先我想到的是排列数组合数,由于题目要求是无重复数字,因此为排列数。排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个不同的元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数。
我们可以得出此题的排列数是 4! / (4-3)! = 4! = 24 (个)
方法一:我们可以循环遍历3个数字,由于要求不重复数字,因此在输出时做出条件判断,只输出百位数十位数个位数都不相同的数。
- arrange = 0 # 定义排列数
- nums = range(1, 5)
-
- # 方法一
- for i in nums: # 百位数
- for j in nums: # 十位数
- for k in nums: # 个位数
- if ((i != j) and (j != k) and (k != i)): # 只输出无重复数字
- print(i, j, k)
- arrange += 1
- print(arrange)
运行结果如下:
- 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 个
-
- Process finished with exit code 0
方法二:可以直接调用itertools的permutations()类,# itertools,是python的一个内置模块,功能强大,主要用于高效循环创建迭代器。注意一点,他返回的不是list,而是iterator
- import itertools # itertools,是python的一个内置模块,功能强大,主要用于高效循环创建迭代器。注意一点,他返回的不是list,而是iterator
-
- arrange = 0 # 定义排列数
- nums = range(1, 5)
- for i in itertools.permutations(nums, 3): # (迭代的元素,迭代序列长度)
- print(i)
- arrange += 1
- print(arrange)
运行结果如下:
- (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
方法二种用到的 itertools.permutations 类,该类内容如下:
- class permutations(object):
- """
- Return successive r-length permutations of elements in the iterable.
-
- permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)
- """
- def __getattribute__(self, *args, **kwargs): # real signature unknown
- """ Return getattr(self, name). """
- pass
-
- def __init__(self, range, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__
- pass
-
- def __iter__(self, *args, **kwargs): # real signature unknown
- """ Implement iter(self). """
- pass
-
- @staticmethod # known case of __new__
- def __new__(*args, **kwargs): # real signature unknown
- """ Create and return a new object. See help(type) for accurate signature. """
- pass
-
- def __next__(self, *args, **kwargs): # real signature unknown
- """ Implement next(self). """
- pass
-
- def __reduce__(self, *args, **kwargs): # real signature unknown
- """ Return state information for pickling. """
- pass
-
- def __setstate__(self, *args, **kwargs): # real signature unknown
- """ Set state information for unpickling. """
- pass
-
- def __sizeof__(self, *args, **kwargs): # real signature unknown
- """ Returns size in memory, in bytes. """
- pass
permutations类创建一个迭代器,返回iterable中所有长度为r的项目序列,如果省略了r,那么序列的长度与iterable中的项目数量相同,即会返回一个全排列的结果。