如何在Python中检测列表内四张相同卡牌并移除,同时增加积分?
解决方案:检测并移除四张同rank卡牌
核心思路是先统计每个rank的出现次数,再批量处理符合条件的卡牌,具体步骤如下:
1. 统计Rank出现次数
不管卡牌是字典、对象还是单纯的rank字符串,先遍历所有卡牌,统计每个rank的出现次数。这比两两比对的逻辑更高效,也能轻松扩展到检测三张、四张等任意数量的重复。
手动统计(无需导入模块)
rank_counts = {} for card in player_cards: rank = card["rank"] # 若为对象则用 card.rank if rank in rank_counts: rank_counts[rank] += 1 else: rank_counts[rank] = 1
用Counter简化统计(Python标准库)
from collections import Counter rank_counts = Counter(card["rank"] for card in player_cards)
2. 识别凑齐四张的Rank
从统计结果中筛选出出现次数≥4的rank:
four_of_a_kind_ranks = [rank for rank, count in rank_counts.items() if count >= 4]
3. 移除对应卡牌并更新积分
批量过滤掉所有符合条件的rank卡牌(原地修改原列表或生成新列表),然后根据凑齐的rank数量增加积分:
完整函数示例
def process_four_of_a_kind(cards, current_score): # 统计rank出现次数 rank_counts = {} for card in cards: rank = card["rank"] rank_counts[rank] = rank_counts.get(rank, 0) + 1 # 找出凑齐四张的rank target_ranks = [r for r, cnt in rank_counts.items() if cnt >= 4] # 原地移除所有对应rank的卡牌 cards[:] = [card for card in cards if card["rank"] not in target_ranks] # 更新积分:每个凑齐的rank加1分 current_score += len(target_ranks) return current_score # 测试用例 player_cards = [ {"rank": "A", "suit": "hearts"}, {"rank": "A", "suit": "diamonds"}, {"rank": "A", "suit": "clubs"}, {"rank": "A", "suit": "spades"}, {"rank": "7", "suit": "hearts"}, {"rank": "7", "suit": "diamonds"}, {"rank": "7", "suit": "clubs"}, {"rank": "7", "suit": "spades"}, {"rank": "J", "suit": "hearts"} ] score = 0 score = process_four_of_a_kind(player_cards, score) print("更新后积分:", score) # 输出:2 print("剩余卡牌:", player_cards) # 仅保留J牌
关键细节说明
- 用
cards[:] = ...实现原地修改原列表,避免创建新列表导致引用失效; - 若同一rank出现5张及以上,依然全部移除并加1分(符合Go Fish规则);
- 支持同时处理多个不同rank的四张组合(比如示例中的A和7,积分加2);
- 统计次数的逻辑比两两比对更高效,尤其是当卡牌数量较多时。
内容的提问来源于stack exchange,提问作者Laoster
相关产品推荐
相关产品推荐

