3个月熟练使用python--Day4打卡

2020-08-04  本文已影响0人  Amy_shao

今天的主要思路是优化昨天两道题的代码,减少冗余的list和减少for循环的次数;

1、电影院买票问题

问题:2n个人排队进电影院,票价是50元。在这2n个人当中,其中n个人只有50元,另外n个人只有100元面钞。愚蠢的电影院开始卖票时1分钱也没有。问:有多少种排队方法使得每当一个拥有100元面钞的人买票时,电影院都有50元找钱?

思路:本次代码优化了itertools.permutations()函数处用枚举排列的形式产生了大量重复的排列组合;

代码:

import itertools

x=50

y=100

n=5

list_fifty=[]

list_hundred=[]

list_final=[]

for i in range(1,n+1):

    list_fifty.append(x)

for i in range(1,n+1):

    list_hundred.append(y)

list_combine=list_fifty+list_hundred

list_givend=[]

list_last=[]

for p in itertools.permutations(list_combine,2*n):

    list_p=list(p)

    if list_p not in list_final:

        list_final.append(list_p)##把排列组合的元素去重写入

for i in range(len(list_final)):

    if list(list_final[i])[0]==50:###判断每个排列组合的第一个元素是不是50,如果不是50就剔除

        con_list=list(list_final[i])

        for i in range(2*n):

            if con_list[0:i+1].count(50)<con_list[0:i+1].count(100):#每个位数递增看50的个数会不会比100的个数大,如50的个数比100的个数少,就break

                break

            elif con_list[0:i+1].count(50)>=con_list[0:i+1].count(100)and i==len(con_list)-1:#如50的个数大于等于100的个数,且循环到头了,就打印出来         

                list_givend.append(con_list) #把元素写入到数组中                 

print('最终的排列组合有',len(list_givend),'种,分别是',list_givend)

2、说谎推理题

问题:A、B、C、D、E五位同学各自从不同的途径打听到获得通讯赛第一名的同学的情况:

A:姓李,女同学,年龄13,广东人

B:姓张,男同学,年龄11,湖南人

C:姓陈,女同学,年龄13,广东人

D:姓黄,男同学,年龄11,广西人

E:姓张,男同学,年龄12,广东人

实际上,获得第一名的同学姓什么,性别,年龄,哪里人这四项情况在表中已有,但五位同学所打听到的情况,每人仅有一项是正确的。

请根据此推断获得第一名的同学的情况。

思路:本次代码着重在把20个循环改成4个循环;

代码:

first=['姓李','女性','13岁','广东人']

second=['姓张','男性','11岁','湖南人']

third=['姓陈','女性','13岁','广东人']

fourth=['姓黄','男性','11岁','广西人']

fifth=['姓张','男性','12岁','广东人']

mix=first+second+third+fourth+fifth

def compare(combine,assumption):

    count=len(list(set(combine).intersection(set(assumption))))#取两个list的相等的元素

    return count

name=['姓李','姓张','姓陈','姓黄']

sex=['女性','男性']

age=['13岁','11岁','12岁']

province=['广东人','湖南人','广西人']

for a in name:

    for b in sex:

        for c in age:

            for d in province:

                str_combine=str(a)+','+str(b)+','+str(c)+','+str(d)

                combine= str_combine.split(',')

                result1=compare(combine,first)

                result2=compare(combine,second)

                result3=compare(combine,third)               

                result4=compare(combine,fourth)

                result5=compare(combine,fifth)

                if result1==1 and result2==1 and  result3==1 and result4==1 and result5==1:

                    print(combine)

上一篇下一篇

猜你喜欢

热点阅读