题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
本题看似简单却有十几种方法实现,基础语法玩的特别灵活,可谓过瘾!!!
知识点:
- for循环嵌套
- 列表接收返回结果,append()方法
- len()方法,计算长度
- 循环计数
- 列表生成式
- 字符串方法
- 字符串拼接
方法总结:
- 自加:执行一次循环加1,计算输出符合要求的结果数量
- len()函数:把输出结果接收在一个序列中用len()方法测出长度
- 转化输出结果为符合要求的三位数
方法1:i,j,k在for循环中会组成所有可能的三位数排列,然后if条件语句筛选出符合要求的三位数
缺点:不能测出有多少个符合要求的三位数,输出结果有空格
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if( i != k ) and (i != j) and (j != k):
print (i,j,k)
方法2:用一个变量n自加,每执行一此循环体输出一个三位数之后,n加1
num = [1,2,3,4]
n = 0
for i in num:
for j in num:
for k in num:
if( i != k ) and (i != j) and (j != k):
print (i,j,k)
n = n + 1
print(n)
方法3:用一个列表d接收每次循环体执行之后输出的结果,append函数增加到列表d中,len()函数测出列表d的长度
d=[]
for a in range(1,5):
for b in range(1,5):
for c in range(1,5):
if (a!=b) and (a!=c) and (c!=b):
d.append([a,b,c])
print ("总数量:", len(d))
print (d)
输出结果:
总数量: 24
[[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:字符串相加之后转整形,解决了方法1中输出结果有空格的问题
d = []
for j in range(1,5):
for k in range(1,5):
for l in range(1,5):
if l!=j!=k!=l:
d.append(int(str(j)+str(k)+str(l))) #字符串相加后又转整型
print (d)
print (len(d))
方法5:从输出结果入手,range出输出结果的区间,然后去除不符合要求的元素。取余+地板除得到个位十位百位
line=[]
for i in range(123,433):
a=i%10
b=(i%100)//10
c=(i%1000)//100
if a!=b and b!=c and a!=c and 0<a<5 and 0<b<5 and 0<c<5 :
print (i)
line.append(i)
print('总数量:',len(line))
#print(line) 这里也可以用列表的形式打印出来结果
方法6:列表生成式1,用元祖(x,y,z)获取三位数
line = [(x,y,z) for x in range(1,5) for y in range(1,5) for z in range(1,5) if (x!=y) and (x!=z) and (y!=z)]
print(line)
print('总数量:',len(line))
方法7:列表生成式2,相加的方法获取三位数i*100 + j*10 + k
line = [x*100 + y*10 + z for x in range(1,5) for y in range(1,5) for z in range(1,5) if (x!=y) and (x!=z) and (y!=z)]
print(line)
print('总数量:',len(line))
方法8:列表生成式3,集合{x,y,z}获得三位数,并去除重复的元素
line = [{x,y,z} for x in range(1,5) for y in range(1,5) for z in range(1,5) if len({x,y,z})==3]
print(line)
print('总数量:',len(line))
方法9:用集合去除重复元素,字符串拼接获得三位数,x+y+z
i = 0
num = {'1','2','3','4'}
for x in num:
for y in num:
for z in num:
s = {x,y,z}
if len(s) == 3:
print(x+y+z)
i = i+1
print('总数量:',i)
方法10:用集合去除重复的元素3,列表相加,列表元素分行打印
#import pprint
list_num=['1','2','3','4']
list_result=[]
for i in list_num:
for j in list_num:
for k in list_num:
if len(set(i+j+k))==3:
list_result+=[int(i+j+k)]
print("能组成%d个互不相同且无重复数字的三位数: "%len(list_result))
# pprint.pprint(list_result) pprint可以分行打印列表元素
print(list_result)
方法11:位运算
#从 00 01 10 到 11 10 01
for num in range(6,58):
a = num >> 4 & 3
b = num >> 2 & 3
c = num & 3
if( (a^b) and (b^c) and (c^a) ):
print (a+1,b+1,c+1)
方法12:python自带函数1 form itertools import permutations
实例1:缺点:输出结果为(1,2,3)形式,不算三位数
from itertools import permutations
for i in permutations([1, 2, 3, 4], 3):
print(i)
实例2:' '.join(i)解决了实例1输出结果不是三位数的问题
from itertools import permutations
t = 0
for i in permutations('1234',3):
print(''.join(i))
t += 1
print("不重复的数量有:%s"%t)
实例3:较之实例2更加繁琐,中间多了列表转化为字符串的过程,没有直接采用字符串方便。
import itertools
DataIn = list('1234')
TmpList = []
for x in list(itertools.combinations(DataIn,3)):
TmpList = TmpList + list(itertools.permutations(x,3))
for i in TmpList:
print(''.join(i))
实例4:和实例2实例3大同小异
from itertools import permutations
for i in permutations([1, 2, 3, 4], 3):
k = ''
for j in range(0, len(i)):
k = k + str(i[j])
print (int(k))
方法13:函数。递归法、生成器法
#递归法
def f01(i):
if i==123:
print(i)
return
else:
if (set('567890') & set(str(i))==set()) and (len(set(str(i)))==3):
print(i)
f01(i-1)
f01(432)
#生成器法
def f02():
for i in range(123,433):
if (set('567890') & set(str(i))==set()) and (len(set(str(i)))==3):
yield i
for i in f02():
print(i)
方法14:列表的remove()方法,每经过一次for循环remove当前元素,然后进入下一层循环,即可保证三位数互不重复,妙啊!
list = [1,2,3,4]
for i in list:
list1 = list.copy()
list1.remove(i)
for j in list1:
list2 = list1.copy()
list2.remove(j)
for k in list2:
print(i, j, k)
方法15:优化,减少冗余判断和循环
for i in range(1, 5):
for j in range(1, 5):
if (j==i) :
continue;
for k in range(1, 5):
if (k==i or k==j):
continue;
print(i,j,k);