python字典推导式生成嵌套字典并排序输出

题目

# 题目:学生成绩信息管理
# 描述:
# 用字典推导式产生40个学生的学号及语文、数学、英语成绩(成绩随机产生,范围在50-150之间)
#    如:{'学号:201801': {'语文': 68, '数学': 126, '英语': 84},
#            '学号:201802': {'语文': 82, '数学': 115, '英语': 67},...}
# 在其中添加总分关键字及总分
# 按总分由高到低列出学号和总分(提示:字典中的数据是无序的,使用sorted排序)

主要用到的知识

1.随机数生成

用到random模块

需要   import random

主要函数及其功能如下:只列出比较常用的几个

random.seed(a=None,version=2)

初始化随机数生成器,用于生成随机数种子,无返回值

例:random.seed(10)   #用整数10做种子

random.seed() #即以系统时间做种子#a=None或被省略

种子必须是以下类型:NoneType,int,float,str,bytes,bytearray

#设置确定的随机种子以后每次运行代码产生的随机数都是一样的,如果想让一个程序中的两个生成随机数的函数都生成一样的随机数就需每个函数之前加上随机种子

random.randint(a,b)

从 [a,b] 随机生成一个整数

例:print(random.randint(1,3))   #输出一个整数:1或2或3

random.random()

从 [0.0,1.0) 随机生成一个浮点数

例:print(random.random())   #输出0.5714025946899135

2.生成字典,用字典推导式

中间的for后面接了另一个字典推导式,也就是嵌套在里面的字典推导式

d={x:  num[x]   for  (  { y : y  for   } )   in range()   }

3.在字典列表中添加新的关键字

直接添加,这种方法如果是后续需要计数在里面的话需要if判断关键字是否存在,不存在需要初始化也就是用以下语句,存在即加一。

d[关键字]=0

4.用shorted给字典排序

第一个参数为排序的数据,直接传入全部数值,第二个参数key为排序的标准,用lambda函数返回,reverse参数为True时为降序(从高到低),为False时为升序

s=sorted( stu.values() , key=lambda x: x['总分'] ,reverse=True)

参考:《python程序设计基础》

代码

# 题目:学生成绩信息管理
# 描述:
# 用字典推导式产生40个学生的学号及语文、数学、英语成绩(成绩随机产生,范围在50-150之间)
#    如:{'学号:201801': {'语文': 68, '数学': 126, '英语': 84},
#            '学号:201802': {'语文': 82, '数学': 115, '英语': 67},...}
# 在其中添加总分关键字及总分
# 按总分由高到低列出学号和总分(提示:字典中的数据是无序的,使用sorted排序)

import random
# 字典中的键
# num=random.sample(range(201800,201899),40)
# 字典中的值
# d={x: random.randint(50,150) for x in ['语文','数学','英语']}
# #字典推导式 d={x: num[x]  for ({y:y for  })in range()}
# print(d)
stu={x:{y:random.randint(50,150) for y in ['语文','数学','英语']} for x in random.sample(range(201800,201899),40) }
print(stu)
# 在其中添加总分关键字及总分
for x in stu.keys():
    stu[x]['总分']=stu[x]['语文']+stu[x]['数学']+stu[x]['英语']

# s=sorted(stu.values(),key=lambda x: x['总分'],reverse=True)
s=sorted(stu.items(),key=lambda x: x[1]['总分'],reverse=True)

d={}
for i in s:
    d[i[0]]={'总分':i[1]['总分']}
print(d)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值