我们做练习的时候,可能都会遇到这样的题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?这个当然是很容易的,只需要三层嵌套循环就可以了。但这却有一个缺点,例如当你的列表是类似[1,2,3,2]这样的带有重复数字的时候,那它的结果也是带有重复数字:[123, 132, 132, 123, 213, 231, 312, 312, 321, 321, 213, 231],这显然是不我们想要的结果。今天我们可以就这个问题探讨一下,看看怎么改进:
改进有两点:1,如果你给的数字列表中含有一样的数字,就去除重复值 2,根据去除重复数字后的列表,进行相应层次的遍历:比如你给了6个数[2,3,5,3,6,5],去重后就是[2,3,5,6],那么这些数字能组成多少个互不相同且无重复数字的4位数?又各是多少呢?来看一看我的代码:
#导入模块
import itertools
#原始输入值
a=[1,0,0,8,3]
#去重
ccc = sorted(set(a),key=a.index)
#未去重前的列表
b = []
number = 0
#遍历所有可能
for i in itertools.permutations(ccc):
if i[0] != 0:
b.append(i)
#去重
j=sorted(set(b),key=b.index)
#j是去重后的列表,每一个元素都是一个元组
print('重组列表,其长度为:'+str(len(j))+'如下:' )
print(j)
#单个元组的长度,也就是最后要遍历的层数
item_len = len