为什么不能从字典中追加此值?

卡伦布斯

我有一个旨在模拟纸牌游戏21的程序。这是我的代码中非常重要的自我解释的重要元素(我已突出显示行,我将在后面提到)

spades = ['2S','3S','4S','5S','6S','7S','8S','9S','10S','JS','QS','KS','AS']
hearts = ['2H','3H','4H','5H','6H','7H','8H','9H','10H','JH','QH','KH','AH']
clubs = ['2C','3C','4C','5C','6C','7C','8C','9C','10C','JC','QC','KC','AC']
diamonds = ['2D','3D','4D','5D','6D','7D','8D','9D','10D','JD','QD','KD','AD']
allCards = spades + hearts + clubs + diamonds

cardVal = {'2S':2,'3S':3,'4S':4,'5S': 5,'6S':6,'7S':7,'8S':8,'9S':9,'10S':10,'JS':10,'QS':10,'KS':10,'AS':11,
    '2H':2,'3H':3,'4H':4,'5H':5,'6H':6,'7H':7,'8H':8,'9H':9,'10H':10,'JH':10,'QH':10,'KH':10,'AH':11,
    '2C':2,'3C':3,'4C':4,'5C':5,'6C':6,'7C':7,'8C':8,'9C':9,'10C':10,'JC':10,'QC':10,'KC':10,'AC':11,
    '2D':2,'3D':3,'4D':4,'5D':5,'6D':6,'7D':7,'8D':8,'9D':9,'10D':10,'JD':10,'QD':10,'KD':10,'AD':11}

import random
random.shuffle(allCards)

playerCards = [allCards.pop() for i in range(2)]
dealerCards = [allCards.pop() for i in range(2)]
playerHand = []
dealerHand = []
playerHandVal = 0
dealerHandVal = 0

def handVal(playercards,playerhand,score):
    playerhand = []
    for i in playercards:
        playerhand.append(cardVal[i]) ####### LINE 29 ######
    score = sum(playerhand)
    print(score)

handVal(playerCards,playerHand,playerHandVal)
handVal(dealerCards,dealerHand,dealerHandVal)

def twist(playercards,playerhand,score):
    newCard = [allCards.pop() for i in range(1)]
    playercards.append(newCard)
    handVal(playercards,playerhand,score)    ####### LINE 39 ########

move = input('Stick (S) or Twist (T) : ')

if move == 'T' or move == 't':
    while move == 'T' or 't':
        twist(playerCards,playerHand,playerHandVal)  ######## LINE 45 ########
        print(playerHand)
        if playerHandVal > 21:
            move = 's'
            break
        move = input('Stick (S) or Twist (T) : ')

当我运行脚本时,它将产生两个长度为2的数组,并在输入提示前为这些卡提供正确的手牌值Stick (S) or Twist (T) :然而,当选择捻程序产生该错误,

  line 45, in <module>
    twist(playerCards,playerHand,playerHandVal)
  line 39, in twist
    handVal(playercards,playerhand,score)
  line 29, in handVal
    playerhand.append(cardVal[i])
TypeError: unhashable type: 'list'

我的问题是,为什么这部分代码playerhand.append(cardVal[i])最初会起作用,但是在twist函数中调用时却无法起作用

暗影游侠

当您这样做时:

newCard = [allCards.pop() for i in range(1)]
playercards.append(newCard)

你插入listplayercards含有从弹出一个值allCards,而不是价值本身。

稍后,当您这样做时:

for i in playercards:
    playerhand.append(cardVal[i]) ####### LINE 29 ######

i不是索引,也不是密钥本身,它是一个元素,list其中包含我认为是您想要的密钥;lists是可变的,因此不适合作为dicts的,并且cardValdict

它的工作一开始,因为你初始化playerhandlist包含两张牌,而不是一个list单元素list的卡片■当你这样做playerCards = [allCards.pop() for i in range(2)],就是额外的吸引,你实现不正确。

解决方法是playercards使用卡片而非单元素卡片填充list

newCard = allCards.pop() # Get the value, not a one-element `list` containing the value
playercards.append(newCard)

如果目标是弹出并附加几张卡片(并且您range(1)暂时只是用作占位符),则要单独附加每张卡片,而不是将list卡片的内容作为单个元素附加,您可以执行以下任一操作:

newCard = [allCards.pop() for i in range(1)]
playercards.extend(newCard)  # extend appends each element from the iterable

或由于playercardsnewCard均为lists,则可以使用运算符重载:

newCard = [allCards.pop() for i in range(1)]
playercards += newCard  # Same as extend, but only works when both sides are same type

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

来自分类Dev

为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

来自分类Dev

为什么我不能从我的活动中调用此服务?

来自分类Dev

为什么PHP json_encode不能从传入的数组中返回正确的值?

来自分类Dev

为什么我不能从以下程序中获得最小值(使用函数和数组)

来自分类Dev

为什么getchar()不能从输入中获取下一个值?

来自分类Dev

为什么不能从decltype返回的value_type中获取布尔值?

来自分类Dev

为什么@Value不能从环境中注入JNDI值?

来自分类Dev

为什么不能从元素中删除样式?

来自分类Dev

为什么不能从Git的工作目录中丢弃文件?

来自分类Dev

为什么不能从表中删除此外键?

来自分类Dev

为什么我不能从远程分支中拉出?

来自分类Dev

为什么我不能从异步代码中捕获异常?

来自分类Dev

我为什么不能从情节提要中创建IBAction

来自分类Dev

为什么我不能从列表中删除所需的元素

来自分类Dev

为什么Windows 7不能从睡眠中唤醒?

来自分类Dev

为什么我不能从该表中删除记录?

来自分类Dev

为什么我不能从XPath查询中检索URL?

来自分类Dev

为什么我不能从C中的函数传回链表?

来自分类Dev

为什么我不能从远程分支中拉出?

来自分类Dev

为什么我不能从开关内的变量中减去?

来自分类Dev

为什么我不能从Main类显示此自定义JFrame?

来自分类Dev

为什么不能从对象访问常量?

来自分类Dev

为什么不能从Throwable分配RuntimeException?

来自分类Dev

为什么不能从Interface继承

来自分类Dev

为什么不能从数组声明对象?

来自分类Dev

为什么不能从beanClass获取注释?

来自分类Dev

为什么不能从 UNION 操作生成

来自分类Dev

为什么Python的sorted()方法不能颠倒字典中具有相同值的键的顺序?

Related 相关文章

  1. 1

    为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

  2. 2

    为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

  3. 3

    为什么我不能从我的活动中调用此服务?

  4. 4

    为什么PHP json_encode不能从传入的数组中返回正确的值?

  5. 5

    为什么我不能从以下程序中获得最小值(使用函数和数组)

  6. 6

    为什么getchar()不能从输入中获取下一个值?

  7. 7

    为什么不能从decltype返回的value_type中获取布尔值?

  8. 8

    为什么@Value不能从环境中注入JNDI值?

  9. 9

    为什么不能从元素中删除样式?

  10. 10

    为什么不能从Git的工作目录中丢弃文件?

  11. 11

    为什么不能从表中删除此外键?

  12. 12

    为什么我不能从远程分支中拉出?

  13. 13

    为什么我不能从异步代码中捕获异常?

  14. 14

    我为什么不能从情节提要中创建IBAction

  15. 15

    为什么我不能从列表中删除所需的元素

  16. 16

    为什么Windows 7不能从睡眠中唤醒?

  17. 17

    为什么我不能从该表中删除记录?

  18. 18

    为什么我不能从XPath查询中检索URL?

  19. 19

    为什么我不能从C中的函数传回链表?

  20. 20

    为什么我不能从远程分支中拉出?

  21. 21

    为什么我不能从开关内的变量中减去?

  22. 22

    为什么我不能从Main类显示此自定义JFrame?

  23. 23

    为什么不能从对象访问常量?

  24. 24

    为什么不能从Throwable分配RuntimeException?

  25. 25

    为什么不能从Interface继承

  26. 26

    为什么不能从数组声明对象?

  27. 27

    为什么不能从beanClass获取注释?

  28. 28

    为什么不能从 UNION 操作生成

  29. 29

    为什么Python的sorted()方法不能颠倒字典中具有相同值的键的顺序?

热门标签

归档