美文网首页
3个月熟练使用python--Day4打卡

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

作者: Amy_shao | 来源:发表于2020-08-04 16:24 被阅读0次

    今天的主要思路是优化昨天两道题的代码,减少冗余的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)

    相关文章

      网友评论

          本文标题:3个月熟练使用python--Day4打卡

          本文链接:https://www.haomeiwen.com/subject/jvcerktx.html