Python存储大量元素并随机选取指定数量的更优实现方法
存储方案优化
- 内存层用字典统一管理所有位置球员:无需为每个位置单独定义列表,后续新增位置、新增球员都不需要修改业务判断逻辑,结构如下:
players = { "goal keeper": ["Neuer","Allison", "De Gea"], "defender": ["Varane", "Ramos", "Thiago Silva","Chiellini", "Shaw", "Alaba"], # 新增位置直接加键值对即可 }
- 大量球员的持久化存储:如果每个位置要加数百名球员,不要硬编码在代码里,把数据存在本地JSON/CSV文件中,程序启动时加载即可。以JSON为例,文件
players.json格式如下:
{ "goal keeper": ["Neuer","Allison", "De Gea", "其他上百名门将"], "defender": ["Varane", "Ramos", "其他上百名后卫"], "midfielder": ["..."], "attacker": ["..."] }
加载时只用一行代码就能读取成上面的字典结构:
import json with open("players.json", "r", encoding="utf-8") as f: players = json.load(f)
后续加球员直接修改JSON文件即可,完全不需要改代码。
代码逻辑优化
- 删除冗余多分支判断:直接用输入的位置作为字典的key取值,不需要写多个if判断位置,大幅减少重复代码。
- 修复现有BUG:原代码最后打印的
routine变量未定义,运行会直接报错,实际需要打印的是阵容列表squad。 - 增加合法性校验:新增位置合法性、选员数量合法性校验,避免用户输入错误导致程序异常,也不用在人数超了之后回滚计数,逻辑更通顺。
- 按需选择随机采样方式:原代码用
random.choices是允许重复抽取同一名球员的,如果你需要同一个球员不会被多次选入阵容,可以换成random.sample,同时提前校验需求人数不超过对应位置的总球员数。 - 避免嵌套列表:原代码用
append把每个位置的球员列表加入阵容,最终会得到二维嵌套列表,想要一维的平铺阵容可以换成extend方法。
优化后代码示例
import random import json # 从本地JSON文件加载球员数据,直接运行可注释下面两行,用后面的字典示例测试 with open("players.json", "r", encoding="utf-8") as f: players = json.load(f) # 测试用内置数据,实际使用可以删掉 # players = { # "goal keeper": ["Neuer","Allison", "De Gea"], # "defender": ["Varane", "Ramos", "Thiago Silva","Chiellini", "Shaw", "Alaba"], # "midfielder": ["De Bruyne", "Frenandes", "Modric", "Thiago","Sane", "Rashford"], # "attacker": ["Lewandowski","Messi","Ronaldo","Mbappe","Neymar","Kane"] # } total_need = int(input("请输入阵容总人数:")) selected_count = 0 squad = [] while selected_count < total_need: position = input("选择要抽取的球员位置:") # 校验位置合法性 if position not in players: print(f"无效位置,可选位置为:{', '.join(players.keys())}") continue need = int(input("输入该位置要抽取的人数:")) # 校验总人数是否超限 if selected_count + need > total_need: print(f"超出阵容总人数,最多还能选{total_need - selected_count}名球员") continue # 校验该位置可选人数是否足够(无重复采样时需要) if need > len(players[position]): print(f"该位置仅{len(players[position])}名可选球员,无法满足需求") continue # 随机抽取,需要无重复就把random.choices换成random.sample selected = random.choices(players[position], k=need) squad.extend(selected) selected_count += need print(f"还需选择{total_need - selected_count}名球员") print("你的最终阵容:", squad)
内容的提问来源于stack exchange,提问作者Harding_Guerrero
相关产品推荐
相关产品推荐

