【问题标题】:why can't I append this value from a dictionary?为什么我不能从字典中附加这个值?
【发布时间】:2016-03-24 16:07:13
【问题描述】:

我有一个旨在模拟纸牌游戏 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]) 最初可以工作,但在扭曲函数中调用时却不行

【问题讨论】:

    标签: python arrays python-3.x dictionary


    【解决方案1】:

    因为列表解析[allCards.pop() for i in range(1)] 的返回值本身就是一个列表。所以在这些行之后:

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

    playercards 可能包含类似于['KS', 'QH', ['JS', '10H']] 的内容。

    稍后在handVal 中,您尝试使用列表中的值索引一个dict (cardVal)。您不能索引具有可变对象类型的 dict,因此您会收到此错误。

    您可能希望将第 38 行更改为:

    playercards.extend(newCard)
    

    【讨论】:

      【解决方案2】:

      当你这样做时:

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

      您正在将 list 插入到 playercards 中,其中包含从 allCards 弹出的单个值,而不是值本身。

      稍后,当你这样做时:

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

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

      它最初是有效的,因为您将 playerhand 初始化为包含两张牌的 list,而不是 list 的单个元素 lists 的牌 playerCards = [allCards.pop() for i in range(2)],这是您额外的抽奖实施不正确。

      解决方法是用卡片填充 playercards,而不是单个元素 lists 卡片:

      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
      

      【讨论】:

        猜你喜欢
        • 2020-05-19
        • 1970-01-01
        • 2020-04-09
        • 2020-10-06
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        • 2022-01-24
        相关资源
        最近更新 更多