我们做练习的时候,可能都会遇到这样的题目:有四个数字: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(j[0])
print('长度为,也就是最后要遍历的层数:' + str(item_len))
x = item_len-1#2
c = 0
#存放最终组合的列表
final = []
#遍历列表j
for items in j:
#遍历j中的每一个元组items
for i in items :
#计算符合要要求的数据
c = c + i*(10**(x))
x = x - 1 #10的次方数减1
if x >= 0:#如果x>=0,