You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:15:09