使用list.index()报错:元素不在列表中,Python扑克牌代码问题
解决手牌价值计算中的
ValueError: 元素不在列表中问题 看起来你遇到的问题很典型——咱们先拆解错误根源,再一步步修复:
错误原因分析
1. 已移除的牌无法在原列表中找到
你的pickUp()函数在选牌后,会把选中的牌从对应的花色列表(比如diamondsCards)里用remove()删掉。但之后cardCount()函数又试图在这些已经被修改过的花色列表里找这张牌的索引,这当然会报错——因为这张牌已经不在原列表里了!
比如你抽到了Nine of Diamonds,执行diamondsCards.remove(temp)后,这张牌就从diamondsCards里消失了,后续调用diamondsCards.index("Nine of Diamonds")自然会抛出ValueError。
2. 累加操作的语法错误
你写的cardValue =+ heartsCards.index(card) + 1是错误的,这里的=+不是累加运算符,它会把右边的值直接赋值给cardValue(相当于覆盖之前的数值),正确的累加写法应该是cardValue += ...。
修复方案
我们可以换个思路,不用依赖原花色列表的索引来计算价值,或者保留原始列表的副本用于查询。这里提供两种修复方式:
方式一:修改现有代码,保留原结构
我们可以保留一份不会被修改的原始花色列表,用来计算牌的价值,抽牌操作则在副本上进行:
import random # 定义原始花色列表(不会被修改,仅用于查询价值) original_hearts = ["Ace of Hearts","Two of Hearts","Three of Hearts","Four of Hearts","Five of Hearts","Six of Hearts","Seven of Hearts","Eight of Hearts","Nine of Hearts","Ten of Hearts","Jack of Hearts","Queen of Hearts","King of Hearts"] original_diamonds = ["Ace of Diamonds","Two of Diamonds","Three of Diamonds","Four of Diamonds","Five of Diamonds","Six of Diamonds","Seven of Diamonds","Eight of Diamonds","Nine of Diamonds","Ten of Diamonds","Jack of Diamonds","Queen of Diamonds","King of Diamonds"] original_clubs = ["Ace of Clubs","Two of Clubs","Three of Clubs","Four of Clubs","Five of Clubs","Six of Clubs","Seven of Clubs","Eight of Clubs","Nine of Clubs","Ten of Clubs","Jack of Clubs","Queen of Clubs","King of Clubs"] original_spades = ["Ace of Spades","Two of Spades","Three of Spades","Four of Spades","Five of Spades","Six of Spades","Seven of Spades","Eight of Spades","Nine of Spades","Ten of Spades","Jack of Spades","Queen of Spades","King of Spades"] # 用于抽牌的列表(会被修改) heartsCards = original_hearts.copy() diamondsCards = original_diamonds.copy() clubsCards = original_clubs.copy() spadesCards = original_spades.copy() yourCards = [] cardValue = 0 def pickUp(): randomNum = random.randint(1,4) if randomNum == 1: temp = random.choice(heartsCards) yourCards.append(temp) heartsCards.remove(temp) elif randomNum == 2: temp = random.choice(diamondsCards) yourCards.append(temp) diamondsCards.remove(temp) elif randomNum == 3: temp = random.choice(clubsCards) yourCards.append(temp) clubsCards.remove(temp) elif randomNum == 4: temp = random.choice(spadesCards) yourCards.append(temp) spadesCards.remove(temp) def cardCount(): global cardValue cardValue = 0 # 每次计算前重置价值,避免重复累加 for card in yourCards: if "Hearts" in card: cardValue += original_hearts.index(card) + 1 elif "Diamonds" in card: cardValue += original_diamonds.index(card) + 1 elif "Clubs" in card: cardValue += original_clubs.index(card) + 1 elif "Spades" in card: cardValue += original_spades.index(card) + 1 return cardValue pickUp() pickUp() print(cardCount())
方式二:优化代码结构,更简洁高效
我们可以用字典来统一管理花色和牌值,这样不用维护多个独立列表,代码更清晰易维护:
import random # 定义所有花色及对应的牌面 suits = { "Hearts": ["Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"], "Diamonds": ["Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"], "Clubs": ["Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"], "Spades": ["Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"] } your_cards = [] card_value = 0 def pick_up(): # 随机选择花色 suit = random.choice(list(suits.keys())) # 随机选择该花色下的牌面 rank = random.choice(suits[suit]) card_name = f"{rank} of {suit}" your_cards.append(card_name) # 从花色列表中移除已选牌面 suits[suit].remove(rank) def card_count(): global card_value card_value = 0 for card in your_cards: # 拆分牌名获取花色和牌面 rank, _, suit = card.split(" ", 2) # 计算牌值(索引+1)并累加 card_value += suits[suit].index(rank) + 1 return card_value pick_up() pick_up() print(card_count())
额外优化点说明
- 把多个
if改成elif,确保每张牌只会匹配一次花色判断,减少不必要的计算 - 在
cardCount()开头重置价值为0,避免多次调用时累加之前的旧值 - 方式二的结构更灵活,后续扩展规则(比如A的价值可选1或11)时会更方便
内容的提问来源于stack exchange,提问作者David Latimer
相关产品推荐
相关产品推荐

