如何用Python实现基于用户输入的列表项评分排序与存储?
解决思路与代码优化
1. 用字典关联项目与分数
直接用Python字典存储每个项目的分数,键为项目名称,值为对应分数,初始值设为0,完美实现项目与分数的绑定。
2. 简化文件读取逻辑
原代码处理换行的操作可以用strip()方法替代,直接去除每行的换行符和首尾空白,代码更简洁。
3. 避免重复比较同一项目
循环中确保随机选中的两个项目不同,避免无意义的自我比较。
4. 输入验证与分数更新
添加输入合法性校验,仅接受1或2的输入,根据选择对应更新分数:选中项+1,另一项-1。
5. 排序并保存结果
用户通过Ctrl+C终止程序后,按分数降序排序项目,将排名、项目名、分数保存到新的TXT文件中。
完整优化代码
import random # 读取项目列表并初始化分数字典 items = [] with open('items.txt', 'r', encoding='utf-8') as f: for line in f: item = line.strip() if item: # 跳过空行 items.append(item) # 初始化分数字典,所有项目初始分数为0 score_dict = {item: 0 for item in items} try: while True: # 随机选中两个不同的项目 idx1, idx2 = random.sample(range(len(items)), 2) item1 = items[idx1] item2 = items[idx2] # 展示选项并获取用户输入 print(f"\n哪个更优?\n1. {item1}\n2. {item2}") answer = input("请输入1或2:").strip() # 处理合法输入,更新分数 if answer == '1': score_dict[item1] += 1 score_dict[item2] -= 1 elif answer == '2': score_dict[item2] += 1 score_dict[item1] -= 1 else: print("输入无效,请输入1或2!") except KeyboardInterrupt: # 用户终止程序后,排序并保存结果 print("\n正在保存结果...") # 按分数降序排序,分数相同则按项目名称排序 sorted_items = sorted(score_dict.items(), key=lambda x: (-x[1], x[0])) # 保存到文件 with open('ranked_items.txt', 'w', encoding='utf-8') as f: f.write("排名\t项目名称\t分数\n") for rank, (item, score) in enumerate(sorted_items, 1): f.write(f"{rank}\t{item}\t{score}\n") print("结果已保存到ranked_items.txt")
代码说明
- 字典存储分数:
score_dict实现项目与分数的快速关联,查找和更新操作高效。 - 随机选不同项目:
random.sample直接生成两个不同的索引,避免重复比较。 - 输入验证:仅响应合法输入,错误输入会给出提示。
- 优雅终止:捕获
KeyboardInterrupt异常,用户按Ctrl+C即可停止程序并自动保存结果。 - 排序保存:按分数从高到低排序,分数相同时按项目名排序,保存的文件包含排名、项目和分数,结构清晰。
内容的提问来源于stack exchange,提问作者rorycoding21
相关产品推荐
相关产品推荐

