【问题标题】:I'm getting a KeyError after incrementing the value of another variable with the current value in the Key, don't know what I'm missing在用 Key 中的当前值增加另一个变量的值后,我得到一个 KeyError,不知道我错过了什么
【发布时间】:2021-05-11 09:42:49
【问题描述】:
from random import shuffle
def makeDeck():
    Deck = []
    for i in range(4):
        valueCards = ["A", "K", "J", "Q"]
        Deck.append(valueCards)
        for cards in range(2,11):
            Deck.append(cards)
    shuffle(Deck)
    print(Deck)
    return Deck

我通过像以前一样设置 self.score = self.setScore() 对类进行了一些更改,当我将它设置为一个数字时,值根本没有被更新。

class Player:
    def __init__(self, drawn = []):
        self.drawn = drawn
        
        self.score = self.setScore()
    def __str__(self):
        currentDraw = ""
        for cards in self.drawn:
            currentDraw += str(cards) + " "
        finalDraw = currentDraw + "score: " + str(self.score)
        return finalDraw


    def setScore(self):
        self.score = 0

        cardValues = {"A":11, "K":10, "J":10, "Q":10,
                      "2":2, "3":3, "4":4, "5":5, "6":6,
                      "7":7, "8":8, "9":9, "10":10}
        for cards in self.drawn:
            self.score += cardValues[cards]
        return self.score

我通过打印出一些类似的值来测试我正在更新,并且这些值打印控制台就好了。

Player1 = Player(["4", "9"])
print(Player1)

当我添加下一位时,我收到了错误并且不知道为什么。

cardDeck = makeDeck()
firstDraw = [cardDeck.pop()]
DrawOne = " ".join(str(e) for e in firstDraw)
secondDraw = [cardDeck.pop()]
DrawTwo = " ".join(str(j) for j in secondDraw)
thirdDraw = [cardDeck.pop()]
First = Player(firstDraw)
player1 = Player(secondDraw)
player2 = Player(thirdDraw)
defeat = False

while(defeat != True):
    choice = input("Higher or lower?: ")
    if choice == "Higher" or "higher":
        if DrawOne < DrawTwo:
            counter  += 1
            print(player1.score)
    if choice == "Lower" or "lower":
        if DrawOne > DrawTwo:
            counter += 1
            print(player1.score)
            player1
    else:
        defeat = True
        print(player1.score)
        print("Defeat")

【问题讨论】:

    标签: python dictionary keyerror


    【解决方案1】:

    在 Makedeck 中,您有以下几行:

    valueCards = ["A", "K", "J", "Q"]
    Deck.append(valueCards)
    

    这导致 Deck 是一个元素的列表,该元素是 4 个字符串的列表。

    您可以检查 makedeck() 的结果 = [["A", "K", "J", "Q"], 2, 3, 4, 5, 6, 7, 8, ... ],因此deck.pop() = ["A", "K", "J", "Q"]。 你真正想要的是这个:

    Deck.extend(valueCards)
    

    这将产生一个由 4 个字符串组成的列表,并在函数的末尾返回 ["A", "K", "J", "Q", 2, 3, ...],即你想要的。

    在第一种情况下,您检查元素 ["A", "K", "J", "Q"] 是否作为您的 dict 的键存在,但事实并非如此。

    【讨论】:

      【解决方案2】:

      我修复了 KeyError 和其他一些错误,包括:

      • KeyError问题,你的卡片类型是整数,而dict cardValues键是字符串
      • DriesDS 回答了 makeDeck 错误
      • 变量counter 未定义且从未真正使用过
      • if-else语法错误和逻辑错误

      代码:

      from random import shuffle
      def makeDeck():
          Deck = []
          for i in range(4):
              valueCards = ["A", "K", "J", "Q"]
              Deck.extend(valueCards)#answerd by DriesDS
              for cards in range(2,11):
                  Deck.append(cards)
          shuffle(Deck)
          print(Deck)
          return Deck
      
      class Player:
          def __init__(self, drawn = []):
              self.drawn = drawn
              
              self.score = self.setScore()
          def __str__(self):
              currentDraw = ""
              for cards in self.drawn:
                  currentDraw += str(cards) + " "
              finalDraw = currentDraw + "score: " + str(self.score)
              return finalDraw
      
      
          def setScore(self):
              self.score = 0
      
              cardValues = {"A":11, "K":10, "J":10, "Q":10,
                            "2":2, "3":3, "4":4, "5":5, "6":6,
                            "7":7, "8":8, "9":9, "10":10}
              for cards in self.drawn:
                  self.score += cardValues[str(cards)]#your cards type is interger,while dict cardValues key are strings
              return self.score
      
      Player1 = Player(["4", "9"])
      print(Player1)
      cardDeck = makeDeck()
      firstDraw = [cardDeck.pop()]
      DrawOne = " ".join(str(e) for e in firstDraw)
      secondDraw = [cardDeck.pop()]
      DrawTwo = " ".join(str(j) for j in secondDraw)
      thirdDraw = [cardDeck.pop()]
      First = Player(firstDraw)
      player1 = Player(secondDraw)
      player2 = Player(thirdDraw)
      defeat = False
      counter = 0
      
      while(defeat != True):
          choice = input("Higher or lower?: ")
          if choice == "Higher" or choice == "higher":
              if DrawOne < DrawTwo:
                  counter  += 1
                  print(player1.score)
          elif choice == "Lower" or choice == "lower":
              if DrawOne > DrawTwo:
                  counter += 1
                  print(player1.score)
          else:
              defeat = True
              print(player1.score)
              print("Defeat")
      

      结果:

      4 9 score: 13
      ['A', 6, 6, 9, 5, 7, 'A', 4, 'Q', 5, 7, 5, 9, 8, 9, 4, 'K', 7, 'J', 3, 8, 'K', 2, 9, 'J', 4, 2, 8, 'K', 10, 7, 'A', 3, 'Q', 6, 2, 5, 6, 'Q', 3, 'J', 10, 2, 10, 4, 10, 'Q', 'A', 3, 8, 'K', 'J']
      Higher or lower?: higher
      10
      Higher or lower?: lower
      Higher or lower?: 1
      10
      Defeat
      

      【讨论】:

      • 我看不出写 ``` if choice == "Higher" 或 "higher" 有什么区别:``` 与 ``` if choice == "Higher" 或 choice = =“更高”:```使。我不明白为什么会出现语法或逻辑错误。
      • Python 将 """ifchoice == "Higher" 或 "higher":""" 解释为 """if ((choice == "Higher") 或 ("higher"):" ""。由于如果字符串为非空,则将字符串转换为布尔值始终为 true,因此这与编写 """if (choice=="Higher") 或 (true):""" 相同,并且始终为true,独立于choice的值。"""ifchoice == "Higher" orchoice == "higher":""" 将被解释为"""if (choice == "Higher") or (choice = = "higher"):""",这就是你想要的。另一个有效的可能性是 """if selection in ["Higher", "higher"]:""" or: """if choice.lower() == "更高":"""
      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多