如何让Python字典添加新键时识别重复键并终止后续操作
球员管理程序添加功能修复
问题描述
用户编写了一个Python球员管理程序,使用brave_roster字典存储球员数据。核心需求是:当用户选择添加球员选项时,若输入已存在的球员名(字典的key),直接提示**"That player is already on our roster."**(中文:"该球员已在名单中。"),且不继续询问球员的stats数据,但当前代码无法实现该逻辑。
原代码如下:
def main(): # initial roster brave_roster = { "Austin Riley": "AB: 615, R: 90, H: 168, HR: 38, AVG: 0.273", "Ronald Acuna": "AB: 467, R: 71, H: 124, HR: 15, AVG: 0.266", } print("\t *** Braves Stats! ***\n") print("Welcome to My Braves Stats! What can I do for you?\n") print(" 1. Search for a player") print(" 2. Add a new player") print(" 3. Remove a player") name = brave_roster stats = brave_roster choice = input("Please type your choice number:") if (choice == "1"): name = input("Enter the name of the player you want to lookup:\n") new_roster = lookup_player(brave_roster, name) elif (choice == "2"): name = input("Enter the name of the player you want to add:\n") stats = input("Please add the player's stats:\n") new_play = add_player_to_dict(brave_roster,name,stats) else: (choice == "3") name = input("Enter the name of the player you want to remove:\n") delete_in_dict(brave_roster,name) #my code: def add_player_to_dict(brave_roster,name,stats): if name not in brave_roster: brave_roster[name] = stats brave_roster.update([(name, stats)]) print("Here's", ["name"],"'s stats:\n") for name, stats in brave_roster.items(): print(name, ':', stats) return brave_roster[name] else: if name in brave_roster.items(): if name in brave_roster: brave_roster[name]= [brave_roster[name]] print("That player is already on our roster.") return brave_roster[name] main ()
期望效果示例:
Welcome to My Braves Stats! What can I do for you? 1. Search for a player 2. Add a new player 3. Remove a player Please type your choice number:2 Enter the name of the player you want to add: Austin Riley That player is already on our roster.
问题分析
- 逻辑顺序错误:原代码在选择添加球员时,先询问球员名后直接索要stats,未先判断球员是否存在,导致无论球员是否在名单中,用户都必须输入stats,不符合需求。
add_player_to_dict函数逻辑混乱:函数内条件判断、循环和return语句位置错误,存在球员时无法正确提示,还会错误修改已有数据。- 冗余与错误判断:
brave_roster.update([(name, stats)])属于冗余操作(已通过brave_roster[name] = stats添加数据);name in brave_roster.items()判断错误,items()返回键值对元组,应直接用name in brave_roster判断键是否存在。
修正后的代码
def main(): # initial roster brave_roster = { "Austin Riley": "AB: 615, R: 90, H: 168, HR: 38, AVG: 0.273", "Ronald Acuna": "AB: 467, R: 71, H: 124, HR: 15, AVG: 0.266", } print("\t *** Braves Stats! ***\n") print("Welcome to My Braves Stats! What can I do for you?\n") print(" 1. Search for a player") print(" 2. Add a new player") print(" 3. Remove a player") choice = input("Please type your choice number: ") if choice == "1": name = input("Enter the name of the player you want to lookup:\n") lookup_player(brave_roster, name) elif choice == "2": name = input("Enter the name of the player you want to add:\n") # 先判断球员是否存在,存在直接提示,不询问stats if name in brave_roster: print("That player is already on our roster.") else: stats = input("Please add the player's stats:\n") add_player_to_dict(brave_roster, name, stats) elif choice == "3": name = input("Enter the name of the player you want to remove:\n") delete_in_dict(brave_roster, name) else: print("Invalid choice, please enter 1, 2, or 3.") def add_player_to_dict(brave_roster, name, stats): # 主函数已判断球员不存在,直接添加数据 brave_roster[name] = stats print(f"Here's {name}'s stats:\n") print(f"{name}: {stats}") return brave_roster # 补充查询球员函数 def lookup_player(brave_roster, name): if name in brave_roster: print(f"{name}: {brave_roster[name]}") else: print("Player not found.") # 补充删除球员函数 def delete_in_dict(brave_roster, name): if name in brave_roster: del brave_roster[name] print(f"{name} has been removed from the roster.") else: print("Player not found, cannot remove.") main()
修正说明
- 调整主函数逻辑:选择添加球员后,先获取球员名并判断是否在字典中,存在则直接提示,不存在才询问stats并调用添加函数。
- 重构添加函数:简化
add_player_to_dict逻辑,仅负责添加数据和反馈结果,存在性判断交给主函数处理。 - 补充缺失功能:原代码中
lookup_player和delete_in_dict未实现,补充基础功能示例保证程序完整运行。 - 修复语法错误:将无效的
else: (choice == "3")改为elif choice == "3",增加无效选项提示。
内容的提问来源于stack exchange,提问作者Pislibsco
相关产品推荐
相关产品推荐

