【问题标题】:Iterating through a dict in python is not yielding desired results在 python 中遍历 dict 不会产生预期的结果
【发布时间】:2016-05-08 20:47:58
【问题描述】:

我正在尝试在 python 中构建一副纸牌,但我正在尝试将所有信息存储在字典中。我需要存储卡名(即 2、4、'K' 表示国王,'J' 表示杰克等),卡在黑色杰克中的价值(即 2 值 2,'A' 表示王牌值 1 或 11 取决于场景),以及该特定卡牌剩余的牌数。但是,当我编写我的 python 代码时,我意识到所有的卡值都等于 8。现在,我知道有些地方不对,但我是 python 新手,我试图理解为什么我会产生如此毁灭性的结果

代码示例:

class Card(object):

    def __init__(self, list):
        self.deck_list = list
        self.construct_deck()

    def construct_deck(self):
        #Here we created a dictionary from the list keys
        self.deck = dict.fromkeys(self.deck_list, {'total': 4, 'value': 0})
        self.keys = self.deck.keys()

        for key in self.keys:
            try:
                value = int(key)

            except:

                if key != 'A':
                    value = 10
                else:
                    value = [1,11]

            finally:
                self.deck[key]['value'] = value


    def shuffle_deck(self):
        pass

l = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']

bj = Card(l)

print bj.deck

代码应执行以下操作:

  • 如果键能够转换为 int,则它必须是 2-10,然后将值设置为键的整数版本
  • 但是,如果 try 块失败,则该值必须是 char。所有漂亮牌(杰克、国王和王后)的值都是十,所以如果关键是“J”、“K”或“Q”,则值应设置为 10,否则应设置为列表 [1,11]。最后,finally 应该将值分配给与该键对应的值

【问题讨论】:

    标签: python


    【解决方案1】:

    问题是您使用 dict.fromkeys() 并将值 dict 作为默认值。这会将 same 字典设置为所有键的值,因此如果您更新一个,它们都会更新。

    更好的解决方案是设置一个空字典,然后遍历deck_list。 (还要注意self.keysself.deck_list 相同;两者都没有意义)。

    此外,您应该始终避免使用空白,除非;捕获您期望的错误,在这种情况下只是 ValueError。这也不是很好地使用finally;只需删除它并取消缩进块。

    self.deck = {}
    
    for key in self.deck_list:
    
        try:
            value = int(key)
        except ValueError:
            if key == 'A':
                value = [1,11]
            else:
                value = 10
    
        self.deck[key] = {'total': 4, 'value': value}
    

    【讨论】:

    • 非常感谢您的帮助。看到哪里出错了,问题就解决了
    【解决方案2】:

    您最初的“fromkeys”语句将所有值设置为同一个 dict 对象。您可以通过以下方式证明这一点:

    print bj.deck['3'] is bj.deck['4']
    # prints True
    

    由于这些值都是对同一个 dict 的引用,因此您解析的最终键“8”将成为该 dict 的“值”。

    您可以通过为每个键创建单独的字典来解决此问题:

    self.deck = dict([(k, {'total': 4, 'value': 0}) 
                     for k in self.deck_list])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多