python笔记50-面试题:交换圣诞节礼物
前言
圣诞节快到啦,为了打造良好的工作环境,同事之间的关系和谐,现在玩一个交换礼物的小游戏。
每个同事准备一个礼物,到时候互相交换,自己手里的礼物必须交换出去,并且得到一个其它人的礼物。
交换礼物
我们假设有同事A,B,C,D,E,每个人都准备了一个小礼物,给礼物对应的编号1,2,3,4,5。
每个同事可以随机得到一个礼物,但是不能拿到自己的。
import random ''' 交互礼物,员工ABCDE分别有礼物12345编号,每个员工不能抽到自己的 # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ ''' people = { "A": 1, "B": 2, "C": 3, "D": 4, "E": 5, } # 所有的礼物编号 gifts = [i for i in people.values()] def get_gift(): '''随机抽取礼物''' # 设置一个随机值,范围是0-礼物数量减1 n = random.randint(0, len(gifts)-1) if people.get(x) == gifts[n]: # 判断等于自己的礼物 get_gift() # 重新抽取 else: print("%s 取到了礼物编号 %s" % (x, gifts[n])) # 取到了礼物后,把礼物从礼品盒里面移除掉 del gifts[n] if __name__ == '__main__': while 1: if len(gifts) == 0: print("换礼物结束!") exit() x = input("输入一个员工:") if x not in people.keys(): print("输入员工名称ABCDE") else: get_gift()
自由分配
不输入员工名称,让员工自由取值。
import random ''' 交互礼物,员工ABCDE分别有礼物12345编号,每个员工不能抽到自己的 # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ ''' people = { "A": 1, "B": 2, "C": 3, "D": 4, "E": 5, } # 所有的礼物编号 gifts = [i for i in people.values()] def get_gift(): '''随机抽取礼物''' # 设置一个随机值,范围是0-礼物数量减1 n = random.randint(0, len(gifts)-1) if people.get(x) == gifts[n]: # 判断等于自己的礼物 get_gift() # 重新抽取 else: print("%s 取到了礼物编号 %s" % (x, gifts[n])) # 取到了礼物后,把礼物从礼品盒里面移除掉 del gifts[n] if __name__ == '__main__': for x in people.keys(): if x not in people.keys(): print("输入员工名称ABCDE") else: get_gift()
运行结果
A 取到了礼物编号 5 B 取到了礼物编号 4 C 取到了礼物编号 2 D 取到了礼物编号 1 E 取到了礼物编号 3
这样写会有个小BUG,当ABCD先取到了1234,那最后一个就没得拿了
判断最后2个礼物的情况
为了避免前面的4个小伙伴刚好取到1234,把5留个最后一个小伙伴的尴尬情况,在还剩最后2个的时候,就做个判断会有3种情况
- 最后2个礼物 刚好是最后2个小伙伴的,换着拿
- 最后2个礼物 都不是最后2个小伙伴的,随便拿
- 最后2个礼物 其中有1个是属于最后2个小伙伴的,换着拿
import random ''' 交互礼物,员工ABCDE分别有礼物12345编号,每个员工不能抽到自己的 ''' # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ people = { "A": 1, "B": 2, "C": 3, "D": 4, "E": 5, } # 所有的礼物编号 gifts = [i for i in people.values()] employees = [j for j in people.keys()] def get_gift(): '''随机抽取礼物''' # 判断最后2个礼物是不是有可能拿到自己的 if len(gifts) == 2: # 情况1:最后2个礼物,刚好是最后2个人的 if people[employees[0]] in gifts and people[employees[1]] in gifts: if people[employees[0]] == gifts[0]: print("%s 取到了礼物编号 %s" % (employees[0], gifts[1])) print("%s 取到了礼物编号 %s" % (employees[1], gifts[0])) else: print("%s 取到了礼物编号 %s" % (employees[0], gifts[0])) print("%s 取到了礼物编号 %s" % (employees[1], gifts[1])) exit() # 情况2:最后2个礼物,都不是最后2个人的 elif people[employees[0]] not in gifts and people[employees[1]] not in gifts: print("%s 取到了礼物编号 %s" % (employees[0], gifts[0])) print("%s 取到了礼物编号 %s" % (employees[1], gifts[1])) exit() # 情况3:最后2个礼物有其中一个是最后2个的 else: if people[employees[0]] == gifts[0]: print("%s 取到了礼物编号 %s" % (employees[0], gifts[1])) print("%s 取到了礼物编号 %s" % (employees[1], gifts[0])) else: print("%s 取到了礼物编号 %s" % (employees[0], gifts[0])) print("%s 取到了礼物编号 %s" % (employees[1], gifts[1])) exit() # 设置一个随机值,范围是0-礼物数量减1 n = random.randint(0, len(gifts)-1) if people.get(x) == gifts[n]: # 判断等于自己的礼物 get_gift() # 重新抽取 else: print("%s 取到了礼物编号 %s" % (x, gifts[n])) # 取到了礼物后,把礼物从礼品盒里面移除掉 gifts.pop(n) employees.remove(x) if __name__ == '__main__': for x in people.keys(): if x not in people.keys(): print("输入员工名称ABCDE") else: get_gift()
这样多运行几次都不会有问题了
A 取到了礼物编号 4
B 取到了礼物编号 5
C 取到了礼物编号 2
D 取到了礼物编号 1
E 取到了礼物编号 3
备注:情况1和清空3可以合并为一种
2021年第六期《python接口自动化+测试开发》课程,1月9号开学(火热报名中!)
本期上课时间:1月9号-4月18号,每周六、周日晚上20:30-22:30