Python 字典与列表应用
问题描述
编写程序模拟抽奖活动,每名学生都有一个随机生成的抽奖号码,使用字典记录抽奖号码的相关信息,
即抽奖号码是键(key),学生信息是值(value),学生信息包括学号和姓名;一等奖设置 1 名,二等奖设置 2 名,三等奖设置 3名,一次随机抽取兑奖号码 6 个,输出获奖者信息,并统计各班获奖人数。
编程要求:
1、编写函数,创建“学生抽奖信息”字典;、
A、根据键盘输入的人数创建该字典,要求人数≥6;
B、根据人数为每名学生随机生成抽奖号码,抽奖号码是键(key),学生信息是值(value),学生信息要求从键盘输入,学生信息包括学号和姓名(学号是键,姓名是值),其中学号格式形如:’50210101’(要求加入健壮性判断,必须是 8位数字形式)。
2、编写打印输出字典的函数;
3、编写抽奖函数,能根据奖项的设置和人数的设置,一次随机生成 6 个兑奖号码,按指定格式输出各中奖号码,将中奖结果保存在“学生获奖信息”字典中,并显示该字典信息;
4、编写统计函数,根据“学生获奖信息”字典(根据学号的前 6 位获得班号) 统计各班获奖人数,存放在“班级中奖人数统计”字典中,并显示该字典信息;
5、编写程序,依次调用上述函数,实现抽奖活动的模拟。
A、调用函数 1,创建“学生抽奖信息”字典;
B、调用函数 2,输出“学生抽奖信息”字典;
C、调用函数 3,输出中奖号码,创建“学生获奖信息”字典并输出;
D、调用函数(4),创建“班级中奖人数统计”字典并输出。
实现
函数1,创建“学生抽奖信息”字典
def createdit():
lst = []
学生抽奖信息 = {}
while True:
try:
num = int(input('人数:(>=6)'))
if num <6:
print('必须大于6')
continue
except:
print('必须为整数')
continue
for i in range(num):
num_id = random.randint(0,10)
while num_id in lst:
num_id = random.randint(0,10)
lst.append(num_id)
print('抽奖编号',num_id)
学生抽奖信息[num_id] = {}
stu_id = input('学号:')
while len(stu_id) != 8 or not stu_id.isdigit():
print('学号必须为8位数字')
stu_id = input('学号:')
stu_name = input('姓名:')
学生抽奖信息[num_id][stu_id] = stu_name
return 学生抽奖信息
函数2,输出“学生抽奖信息”字典;
def print_dic(学生抽奖信息):
print('学生抽奖信息如下:')
for k,v in 学生抽奖信息.items():
for k1,v1 in v.items():
print('{}:'.format(k))
print('{'+"'"+k1+"'"+': '+ "'"+v1+"'" + '}')
函数3 输出中奖号码,创建“学生获奖信息”字典并输出;
字典更新用update()
def get_numid(学生抽奖信息):
num_id_list = []
学生获奖信息 = {'一等奖':{},'二等奖':{},'三等奖':{}}
for k,v in 学生抽奖信息.items():
for k1,v1 in v.items():
num_id_list.append(k)
bondlist = random.sample(num_id_list,6)
print('中奖号码:')
print('一等奖:{}'.format(bondlist[0]))
print('二等奖:{}'.format(' '.join(str(n) for n in bondlist[1:3])))
print('三等奖:{}'.format(' '.join(str(n) for n in bondlist[4:])))
学生获奖信息['一等奖'] = 学生抽奖信息[bondlist[0]]
学生获奖信息['二等奖'].update(学生抽奖信息[bondlist[1]])
学生获奖信息['二等奖'].update(学生抽奖信息[bondlist[2]])
学生获奖信息['三等奖'].update(学生抽奖信息[bondlist[3]])
学生获奖信息['三等奖'].update(学生抽奖信息[bondlist[4]])
学生获奖信息['三等奖'].update(学生抽奖信息[bondlist[5]])
print(学生获奖信息)
return 学生获奖信息
函数4 创建“班级中奖人数统计”字典并输出。
def statistics(学生获奖信息):
班级中奖人数统计 = {}
print('各班中奖信息如下:')
for k,v in 学生获奖信息.items():
for k1, v1 in v.items():
if k1[:6] not in 班级中奖人数统计.keys():
班级中奖人数统计[k1[:6]] = 1
else:
班级中奖人数统计[k1[:6]] += 1
for k,v in 班级中奖人数统计.items():
print('{}:\n{}'.format(k,v))
全部代码
import random
def createdit():
lst = []
学生抽奖信息 = {}
while True:
try:
num = int(input('人数:(>=6)'))
if num <6:
print('必须大于6')
continue
except:
print('必须为整数')
continue
for i in range(num):
num_id = random.randint(0,10)
while num_id in lst:
num_id = random.randint(0,10)
lst.append(num_id)
print('抽奖编号',num_id)
学生抽奖信息[num_id] = {}
stu_id = input('学号:')
while len(stu_id) != 8 or not stu_id.isdigit():
print('学号必须为8位数字')
stu_id = input('学号:')
stu_name = input('姓名:')
学生抽奖信息[num_id][stu_id] = stu_name
return 学生抽奖信息
def print_dic(学生抽奖信息):
print('学生抽奖信息如下:')
for k,v in 学生抽奖信息.items():
for k1,v1 in v.items():
print('{}:'.format(k))
print('{'+"'"+k1+"'"+': '+ "'"+v1+"'" + '}')
def get_numid(学生抽奖信息):
num_id_list = []
学生获奖信息 = {'一等奖':{},'二等奖':{},'三等奖':{}}
for k,v in 学生抽奖信息.items():
for k1,v1 in v.items():
num_id_list.append(k)
bondlist = random.sample(num_id_list,6)
print('中奖号码:')
print('一等奖:{}'.format(bondlist[0]))
print('二等奖:{}'.format(' '.join(str(n) for n in bondlist[1:3])))
print('三等奖:{}'.format(' '.join(str(n) for n in bondlist[4:])))
学生获奖信息['一等奖'] = 学生抽奖信息[bondlist[0]]
学生获奖信息['二等奖'].update(学生抽奖信息[bondlist[1]])
学生获奖信息['二等奖'].update(学生抽奖信息[bondlist[2]])
学生获奖信息['三等奖'].update(学生抽奖信息[bondlist[3]])
学生获奖信息['三等奖'].update(学生抽奖信息[bondlist[4]])
学生获奖信息['三等奖'].update(学生抽奖信息[bondlist[5]])
print(学生获奖信息)
return 学生获奖信息
def statistics(学生获奖信息):
班级中奖人数统计 = {}
print('各班中奖信息如下:')
for k,v in 学生获奖信息.items():
for k1, v1 in v.items():
if k1[:6] not in 班级中奖人数统计.keys():
班级中奖人数统计[k1[:6]] = 1
else:
班级中奖人数统计[k1[:6]] += 1
for k,v in 班级中奖人数统计.items():
print('{}:\n{}'.format(k,v))
学生抽奖信息 = createdit()
print_dic(学生抽奖信息)
学生获奖信息 = get_numid(学生抽奖信息)
班级中奖人数统计 = statistics(学生获奖信息)