例题要求:
数字:1,2,3,4,
求这四个数字能生成多少个互不相同且无重复数字的四位数,
#符合要求的数字全部保存在一个空列表中
# (用代码计算得出所有数字以及所有数字的个数)
一层一层判断逻辑为:
①建立含有4个整数的列表
②循环组合
③判断是否重复
第一种方式:
提前用IF判断每一层数不重复
a = [1,2,3,4]
nums = []
for i in a:
for j in a:
if j != i: #如果千位与百位不重复,则继续输出第三位
for k in a:
if k !=i and k !=j: #百位不与十位重复
for h in a:
if h != i and h != j and h != k: #十位不与前三位重复
num = i*1000+j*100+k*10+h
nums.append(num)
print(nums)
print(len(nums))
第二种方式:
循环后去重,将判断条件合并
a = [1,2,3,4]
nums = []
for i in a:
for j in a:
for k in a:
for h in a: #四层循环
#判断每个数字不相等
if i != j and i != k and i != h and j != k and j != h and k != h:
num = 1000*i+100*j+10*k+h
nums.append(num)
print(nums)
print(len(nums))
还可以用range语句优化,好处是省略一次列表赋值。
range函数的格式为:
range(start, stop[, step])
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)。
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5。
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)。
解法最终格式:
nums = []
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
for m in range(1,5):
if i != j and i != k and i != m and j != k and j != m and k != m:
a = 1000*i + 100*j + 10*k + m
nums.append(a)
print(nums)
print(len(nums))
还有一个比较有趣的解法:
利用集合自动去重的方式,只要判定len函数下集合数列可以=4,就完成了逻辑上的去重
a = [1,2,3,4]
nums = []
for i in a:
for j in a:
for k in a:
for h in a:
if len({i,j,k,h}) == 4:
num = i*1000+j*100+k*10+h
nums.append(num)
print(nums)
print(len(nums))