Python100例1

题目:有四个数字: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);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值