如何遍历嵌套布尔列表并聚合得分,遵循DRY原则实现?
实现方案
核心思路:复用计数逻辑,避免重复代码
要遵循DRY原则,关键是不要为用户和电脑分别编写重复的统计逻辑。下面提供两种简洁的实现方式:
方式1:单次遍历同时统计双方胜场
这种方法只遍历一次结果列表,同时累加用户和电脑的胜场数,完全避免重复代码:
game_outcome = [['wins', 'loses'], ['loses', 'wins'], ['loses', 'wins']] user_wins = 0 computer_wins = 0 # 一次遍历处理双方结果 for user_result, computer_result in game_outcome: user_wins += 1 if user_result == 'wins' else 0 computer_wins += 1 if computer_result == 'wins' else 0 # 判断最终胜负 if computer_wins > user_wins: print("computer wins") else: print("user wins")
方式2:拆分结果后复用内置计数方法
通过zip(*game_outcome)将嵌套列表转置,拆分出用户和电脑的所有结果,再复用Python内置的count方法统计胜场,代码更简洁:
game_outcome = [['wins', 'loses'], ['loses', 'wins'], ['loses', 'wins']] # 拆分用户和电脑的所有结果 user_results, computer_results = zip(*game_outcome) # 复用count方法统计胜场,无需重复编写判断逻辑 user_wins = user_results.count('wins') computer_wins = computer_results.count('wins') # 判断最终胜负 if computer_wins > user_wins: print("computer wins") else: print("user wins")
为什么符合DRY原则?
- 两种方式都没有重复编写"判断是否为胜场并计数"的逻辑:方式1在一次循环内同时处理双方,方式2复用了内置的
count方法,仅需调用两次而非重复实现计数逻辑。 - 如果后续胜场的标识(比如从
'wins'改成'win'),只需要修改一处代码即可,无需在多个地方同步修改。
内容的提问来源于stack exchange,提问作者Darman
相关产品推荐
相关产品推荐

