字典迭代变量赋值异常:Solo排位变量被错误设为None
问题分析与解决
核心问题
你的代码逻辑存在关键漏洞:两个循环都会完整遍历整个ranked_stats列表。以Solo排位的循环为例:
- 第一个条目是
RANKED_SOLO_5x5,此时会正确给所有solo_*变量赋值 - 但第二个条目是
RANKED_FLEX_SR,进入else分支后,所有solo_*变量会被重新设为None - 循环结束后,变量保留的是最后一次循环的结果,也就是
None
Flex循环看似正常,只是因为列表最后一个条目是RANKED_FLEX_SR,最后一次循环覆盖成了正确值而已。
修复方案
方案1:初始化默认值,遍历仅更新匹配项
先把所有变量初始化为None,遍历列表时只在匹配到对应队列类型时更新变量,不执行else分支的覆盖操作:
# 初始化Flex变量为默认值 flex_rank_name = "None" flex_tier = "None" flex_rank = "None" totalrank_flex = "None" winrate_flex = "None" wins_flex = "None" losses_flex = "None" # 初始化Solo变量为默认值 solo_rank_name = "None" solo_tier = "None" solo_rank = "None" totalrank_solo = "None" winrate_solo = "None" wins_solo = "None" losses_solo = "None" # 一次遍历处理两种队列类型 for rank in ranked_stats: if rank['queueType'] == "RANKED_FLEX_SR": flex_rank_name = "Ranked Flex" flex_tier = rank["tier"] flex_rank = rank['rank'] totalrank_flex = flex_tier + " " + flex_rank winrate_flex = rank['wins']/(rank['wins']+rank['losses']) winrate_flex *= 100 winrate_flex = "{:.2f}%".format(winrate_flex) wins_flex = rank['wins'] losses_flex = rank['losses'] elif rank['queueType'] == "RANKED_SOLO_5x5": solo_rank_name = "Ranked Solo/Duo" solo_tier = rank["tier"] solo_rank = rank['rank'] totalrank_solo = solo_tier + " " + solo_rank winrate_solo = rank['wins']/(rank['wins']+rank['losses']) winrate_solo *= 100 winrate_solo = "{:.2f}%".format(winrate_solo) wins_solo = rank['wins'] losses_solo = rank['losses']
方案2:用字典存储结果(更简洁易维护)
把两种排位的数据存入字典,避免大量独立变量,代码结构更清晰:
rank_data = { "flex": { "name": "None", "tier": "None", "rank": "None", "total_rank": "None", "winrate": "None", "wins": "None", "losses": "None" }, "solo": { "name": "None", "tier": "None", "rank": "None", "total_rank": "None", "winrate": "None", "wins": "None", "losses": "None" } } for rank in ranked_stats: queue_type = rank['queueType'] if queue_type == "RANKED_FLEX_SR": target = rank_data["flex"] target["name"] = "Ranked Flex" elif queue_type == "RANKED_SOLO_5x5": target = rank_data["solo"] target["name"] = "Ranked Solo/Duo" else: continue # 跳过其他队列类型 target["tier"] = rank["tier"] target["rank"] = rank["rank"] target["total_rank"] = f"{rank['tier']} {rank['rank']}" total_games = rank['wins'] + rank['losses'] winrate = (rank['wins'] / total_games) * 100 target["winrate"] = "{:.2f}%".format(winrate) target["wins"] = rank['wins'] target["losses"] = rank['losses'] # 使用时直接取字典对应值,比如rank_data["solo"]["total_rank"]
验证效果
用你提供的ranked_stats列表测试,两种方案都能正确得到:
- Solo排位数据:
BRONZE II,胜率61.54%,胜8负5 - Flex排位数据:
BRONZE II,胜率50.00%,胜5负5
内容的提问来源于stack exchange,提问作者Exo
相关产品推荐
相关产品推荐

