You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 01:45:01