如何在Python中简便比较随机结果并转为JSON文件积分?
问题描述
我有一段简化的Python代码,目前里面的random语句没起到实际作用。我想要实现的逻辑是:生成三个随机数对应red、blue、green三个对象,比较这三个随机数后,给随机数最高的对象p值加3,第二高的加2,最低的加1。同时要更新JSON文件里的对应值,并且输出排序后的结果(比如rr=22、rb=66、rg=44时,输出blue 3,green 2,red 1,JSON里的p值也同步更新)。
我知道用嵌套if能实现,但这样代码不美观,而且后续新增颜色时扩展性很差,请问有没有更好的实现方式?
现有简化代码:
import json import random y = {} y['red'] = {'name': "red", 'p': 0} y['blue'] = {'name': "blue", 'p': 0} y['green'] = {'name': "green", 'p': 0} with open('y.json', 'w') as f: json.dump(y, f) f = open('y.json') y = json.load(f) rr = random.randint(1, 101) rb = random.randint(1, 101) rg = random.randint(1, 101) z = '%s%s%s' % (y['red']['name'], " ", y['red']['p']) zz = '%s%s%s' % (y['blue']['name'], " ", y['blue']['p']) zzz = '%s%s%s' % (y['green']['name'], " ", y['green']['p']) print('\n'.join(sorted([z, zz, zzz], key=lambda x: int(x.split()[-1]), reverse=True))) with open('y.json', 'w') as f: json.dump(y, f)
解决方案
核心思路是把颜色和对应的随机数打包成列表,然后按随机数降序排序,再依次给每个排序后的对象分配对应的加分(3、2、1)。这种写法不管后续新增多少颜色,只需要补充对应的条目即可,完全不用修改核心逻辑,扩展性拉满。
优化后的代码如下:
import json import random # 初始化颜色数据(实际场景可直接从JSON读取,这里保留你的初始化逻辑) y = { 'red': {'name': "red", 'p': 0}, 'blue': {'name': "blue", 'p': 0}, 'green': {'name': "green", 'p': 0} } # 写入初始JSON(实际使用时可移除,按你的需求保留此步骤) with open('y.json', 'w') as f: json.dump(y, f) # 读取JSON中的数据 with open('y.json', 'r') as f: y = json.load(f) # 生成每个颜色对应的随机数,打包成(随机数, 颜色键)的元组列表 color_randoms = [ (random.randint(1, 101), 'red'), (random.randint(1, 101), 'blue'), (random.randint(1, 101), 'green') ] # 按随机数从大到小排序 color_randoms.sort(reverse=True, key=lambda item: item[0]) # 定义对应名次的加分值:第1名加3,第2名加2,第3名加1 rank_scores = [3, 2, 1] # 遍历排序后的列表,更新p值并收集输出内容 output_lines = [] for (_, color_key), add_score in zip(color_randoms, rank_scores): y[color_key]['p'] += add_score output_lines.append(f"{y[color_key]['name']} {add_score}") # 打印最终结果 print('\n'.join(output_lines)) # 保存更新后的数据到JSON文件 with open('y.json', 'w') as f: json.dump(y, f)
代码细节说明
- 打包与排序:把颜色键和随机数绑定成元组,直接用列表的
sort方法按随机数逆序排列,完全替代了繁琐的嵌套if判断,代码简洁很多。 - 批量加分:用
zip把排序后的颜色列表和加分列表配对,遍历过程中直接给对应颜色的p值加分数。如果后续新增颜色,只需要在color_randoms里加一个元组,同时在rank_scores里补充对应名次的分数(比如新增第四个颜色时,把rank_scores改成[4,3,2,1]即可)。 - 输出与保存:遍历过程中同步收集输出内容,最后统一打印,同时把更新后的数据写入JSON文件,逻辑清晰易懂。
内容的提问来源于stack exchange,提问作者SkyThaKid
相关产品推荐
相关产品推荐

