使用Set实现Python列表元素去重失效问题及代码求助
问题分析与解决方案
首先得指出你代码里的两个核心问题:
set(player_cards)没有生效的原因:你只是把列表转成了去重的集合,但没有把这个集合重新赋值给player_cards,原列表完全没被修改,所以重复项依然留在里面。- 循环逻辑的问题:你当前的循环是一直往列表里加元素,直到长度凑够44,完全不管有没有重复——这就导致最后列表里肯定有大量重复卡牌,哪怕你后面转了集合,也没把结果存下来,所以
print的还是那个带重复的原列表。
解决方案1:用集合自动去重(推荐)
集合的特性就是自动忽略重复元素,用它来存储卡牌最省心,效率也更高:
import random player_cards = set() # 用集合替代列表,自动去重 card_list = ("Hearts", "Diamonds", "Spades", "Clubs") # 循环直到集合里有44张不重复的卡牌 while len(player_cards) != 44: i = random.randint(1, 11) j = random.choice(card_list) card = f"{i} of {j}" player_cards.add(card) # 重复的卡牌会被自动跳过 # 最后转成列表(如果需要列表格式的话) player_cards = list(player_cards) print(player_cards)
解决方案2:坚持用列表,添加前检查重复
如果你一定要用列表来实现,那就在每次生成卡牌后,先检查它是否已经在列表里,只有不存在的时候才添加:
import random player_cards = [] card_list = ("Hearts", "Diamonds", "Spades", "Clubs") while len(player_cards) != 44: i = random.randint(1, 11) j = random.choice(card_list) card = f"{i} of {j}" if card not in player_cards: # 添加前检查是否重复 player_cards.append(card) print(player_cards)
补充说明
你提到用随机生成而不是shuffle是为了测试去重功能,上面的两种方案都能满足你的测试需求:第一种利用集合的天然去重特性,第二种手动检查重复,都能确保最终的player_cards里没有重复卡牌。
内容的提问来源于stack exchange,提问作者GagGreene
相关产品推荐
相关产品推荐

