python2.7练习小例子(一)

    1)题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

    程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

    案例代码:

 

#!/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

    以上实例输出结果为:

 

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

    还有一些别的方法,大家一起来看下。首先是使用列表形式,并计算总结:

 

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 原答案没有指出三位数的数量,添加无重复三位数的数量

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

    将for循环和if语句综合成一句,直接打印出结果:

 

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

list_num = [1,2,3,4]

list  = [i*100 + j*10 + k for i in list_num for j in list_num for k in list_num if (j != i and k != j and k != i)]

print (list)

    设置最大,最小值:

 

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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('the total is :',len(line))

    python3 下参考方案:

 

num=[1,2,3,4]
i=0
for a in num:
    for b in num:
        for c in num:
            if (a!=b) and (b!=c) and (c!=a):
                i+=1
                print(a,b,c)
print('总数是:',i)

    用集合去除重复选项:

 

#!/usr/bin/env python
#-*- coding:utf-8 -*-

#用集合去除重复元素
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)

    python自带这个函数:

 

#!/usr/bin/env python3
#coding:utf-8

from itertools import permutations

for i in permutations([1, 2, 3, 4], 3):
    print(i)

    再来补充下上面的案例,自带函数那个:

 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

#补充一下

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))

    还有没事找事之位运算:

 

# coding:utf-8
#从 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

    考虑减少冗余判断和循环,做如下优化:

 

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);

    Python3 测试实例:

 

#!/usr/bin/python3

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)

    加入了format函数:

 

#!/usr/bin/python
#-*- coding: UTF-8 -*-

list_num = [1,2,3,4]
list = [i*100 + j*10 + k for i in list_num for j in list_num for k in list_num if ( i != j and i != k and j != k)]
d = len(list)
print('1,2,3,4能组成 %d 个互不相同且无重复数字的三位数。' % d)
print('他们各是:%s' % list)

    数量统计用个做自加:

 

#!/usr/bin/env python3
#coding=utf-8

from itertools import permutations
t = 0
for i in permutations('1234',3):
    print(''.join(i))
    t += 1

print("不重复的数量有:%s"%t)

    再来一个:

 

#encoding=utf8
#有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
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)

    直接用列表推导式:

 

#直接用列表推导式
[(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)]

    再来看一个:

 

#coding=utf-8

print("----------递归法  -------------")
#递归法           
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)

print("----------生成器法-------------")
#生成器法
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)

    最后再来看一个:

 

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))

    不得不说,网上的各位大神的奇思妙想非常之多啊。。。上面的实例是本人在网上寻找的,各位可以来看下大神们的思路,有助于提高自己的编码水平。。。

    如果感觉不错的话,请多多点赞支持哦。。。

posted @ 2018-04-23 10:54  luyaran  阅读(731)  评论(1编辑  收藏  举报