在用 Key 中的当前值递增另一个变量的值后,我得到一个 KeyError,不知道我遗漏了什么
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
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
我对 class 做了一些更改,方法是使 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")
在 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 个字符串的列表,并且在函数的末尾 returns ["A", "K", "J", "Q", 2, 3, .. .],这就是你想要的。
在第一种情况下,您检查元素 ["A", "K", "J", "Q"] 是否作为字典的键存在,但事实并非如此。
我修复了 KeyError 和其他一些错误,包括:
- KeyError问题,你的卡片类型是整数,而dict cardValues key是字符串
- 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
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
我对 class 做了一些更改,方法是使 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")
在 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 个字符串的列表,并且在函数的末尾 returns ["A", "K", "J", "Q", 2, 3, .. .],这就是你想要的。
在第一种情况下,您检查元素 ["A", "K", "J", "Q"] 是否作为字典的键存在,但事实并非如此。
我修复了 KeyError 和其他一些错误,包括:
- KeyError问题,你的卡片类型是整数,而dict cardValues key是字符串
- 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