Python学习笔记之基础练习(一)

一、列表练习

    第一题 :

            用户登陆系统
    1). 已知多个用户名和密码分别保存在列表中;
    2). 判断用户名是否存在,
            如果登陆的用户不存在,则报错;;
            如果用户存在, 则判断密码是否正确:
                    如果正确, 输出用户登陆成功;
                    如果不正确, 输出登陆失败;

            3). 为防止黑客暴力破解密码, 登陆最多有3次机会;

names = ["root","student","teacher"]     #存储用户名的列表
passwd = ["1234","4321","0123"]         #存储密码的列表
count = 0
while count < 3:
    count +=1
    username = input("Please enter your user name:")
    if username in names:                                      #验证用户是否存在
        inpasswd = input("Please enter the password:")
        if inpasswd ==  passwd[names.index(username)]:          #验证密码是否正确
            print("Log in successfully!")
            break
        else:
            print("Password mistake")
    else:
        print("User name does not exist!")
else:
    print("Try more than more than three times!")

    第二题 :

        你现在是棒球比赛记录员。
        给定一个字符串列表,每个字符串可以是以下四种类型之一:
                1.整数(一轮的得分):直接表示您在本轮中获得的积分数。
                2. "+"(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
                3. "D"(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
                4. "C"(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应
                    该被移除。
        每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
        你需要返回你在所有回合中得分的总和。
        示例 1:
输入: ["5","2","C","D","+"]
输出: 30
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到2分。总和是:7。
操作1:第2轮的数据无效。总和是:5。
第3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15。

第4轮:你可以得到5 + 10 = 15分。总数是:30。

        注意:
        输入列表的大小将介于1和1000之间。
        列表中的每个整数都将介于-30000和30000之间。

score = ['5','2','C','D','+']
list_score = []                 #记录有效回合得分数
while 'C' in score:
    score.pop(score.index('C')-1)   #C 前面的分数是无效的,因此需要删除列表中的C元素以及所有C元素前面的一个元素
    score.remove('C')
print(score)                     #显示去掉无效分数后的成绩表 
for char in score:
    if char.isdigit():           #如果是数字字符,转为整形,存入有效回合得分数的列表
        list_score.append(int(char))
# 因为我们的原始记录得分的列表中的元素存在大量重复,所以我们不能使用list.index()-1方法求元素的索引,以便找到对应的list_score中的分数
    if char.isupper():           # 因为去掉了C 只剩下所有的字母只剩下D,该轮的的分数等于 list_score列表的最后一个整形数的的两倍
        list_score.append(int(list_score[len(list_score)-1]) * 2)
    if char == '+':             #该轮的的分数等于 list_score列表的倒数2个整形数的和 
       list_score.append(int(list_score[len(list_score)-1]) + int(list_score[len(list_score)- 2]))
print(list_score)               #显示有效回合的得分数
print("总分是:%s"%(sum(list_score)))

    计算结果:

      

二、集合练习

   第一题 :

           明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000

    之间的随机整数(N≤1000), N是用户输入的,对于其中重复的数字,只保留一个,把其余相同的数去掉,不

    同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助

    明明完成“去重”与“排序”的工作; 

import random
N = int(input('需要多少个数字'))
set_num = set()
for count in range(1,N):
    set_num.add(random.randint(1,1000))
print(sorted(set_num))

   第二题 :

           1. 共同好友;
                你的好友A,B,C 他的好友C,B,D, 求共同好友:

                解:

                       这个题的本质是求两个集合的交集:

            Friends1_set = {'A','B','C'}
            Friends2_set = {'C','B','D'}
            print(Friends1_set.intersection(Friends2_set))

           2.   微信群提醒:
                XXX与群里其他人都不是微信朋友关系

                解:    这个题的本质是通过成员操作符来判断某个用户在不在所有好友集合的并集之中:

        user = input('指定的用户:')
        Friends1_set = {'A','B','C'}
        Friends2_set = {'C','B','D'}
        print(Friends1_set.union(Friends2_set))
        if user not in Friends1_set.union(Friends2_set):
            print('%s和其他人都不是微信好友关系'%(user))
        3. 权限判断:
                有一个API,要求同时具备A,B,C权限才能访问,目前用户权限为B,C,D,判断该用户能否访问该API;

                解:这个题的本质是判断一个集合是不是另一个集合的父集(看用户权限是不是ABC权限的父集)

    set_permissions = {'A','B','C'}
    usr1_permissions = {'A','B','C','D','E'}
    usr2_permissions = {'B','C','D'}
    if usr1_permissions.issuperset(set_permissions):
        print("usr1用户可以访问")
    else:
        print("usr1用户不可以访问")
    if usr2_permissions.issuperset(set_permissions):
        print("usr2用户可以访问")
    else:
        print("usr2用户不可以访问")
        4. 集合练习:

               随机产生2组各个数字的列表,每组10个数字,如下要求:

               每个数字取值范围[10,20]统计20个数字中,一共有多少个不同的数字?( 并集)

               2组中,不重复的数字有几个?分别是什么? (对等差分)
               2组中,重复的数字有几个?分别是什么?(交集) 
    import random
    set1 = set(random.sample(range(1,20),10))
    set2 = set(random.sample(range(1,20),10))
    print('set1:%s'%(set1))
    print('set2:%s'%(set2))
    print("20个数字中,一共有%d个不同的数字"%(len(set1.union(set2))))
    print('2组中,不重复的数字有%d个,分别是:%s'%(len(set1.symmetric_difference(set2)),set1.symmetric_difference(set2)))
    print('2组中,重复的数字有%d个,分别是:%s'%(len(set1.intersection(set2)),set1.intersection(set2)))

二、字典的练习

   第一题 :

            重复的单词: 此处认为单词之间以空格为分隔符, 并且不包含,和.;
                1. 用户输入一句英文句子;
                2. 打印出每个单词及其重复的次数;

    str1 = input("请输入句子:")
    #将单词分割处理
    list1 = str1.split()
    #通过字典存储单词和该单词出现的次数
    words_dict = {}
    for char in list1:
        if char not in words_dict:   #该单词是第一次出现
            words_dict[char] = 1
        else :
            words_dict[char] += 1
    print(words_dict)

   第二题 :

            数字重复统计:
            1). 随机生成1000个整数;
            2). 数字的范围[20, 100],
            3). 升序输出所有不同的数字及其每个数字重复的次数;

        方式一:

    import random
    list_num = []
    dict_count = {}
    for i in range(1000):                   #随机生成1000个20-100的数 有重复
        list_num.append(random.randint(20,100))
    list_num.sort()     	        #可以先对生成的列表进行排序 后面不用在进行排序
    for num in list_num:
        if num not in dict_count:
            dict_count[num] = 1
        else:
            dict_count[num] += 1
    print('key   value')
    for item in dict_count:
        print(item,'  ',dict_count[item])
        方式二:
    import random
    list_num = []
    dict_count = {}
    for i in range(1000):       #随机生成num个1-12的数 有重复
        list_num.append(random.randint(20,100))
    for num in list_num:
        if num not in dict_count:
            dict_count[num] = 1
        else:
            dict_count[num] += 1
    sort_num_dict = {}
    for num in sorted(dict_count.keys()):
        sort_num_dict[num] = dict_count[num]
    print('key   value')
    for item in sort_num_dict:
        print(item,'  ',sort_num_dict[item])

    




猜你喜欢

转载自blog.csdn.net/m0_37717595/article/details/80157070