迭代python中的dict并没有产生预期的结果

时间:2016-01-31 10:48:40

标签: python

我正在尝试在python中构建一副牌,但我试图将所有信息存储在字典中。我需要存储卡的名称(例如,2,4,&#39; K&#39;用于国王,&#39; J&#39;用于插孔等),卡的价值在黑色插孔(即, 2值2,“A&#39;对于ace值1或11(取决于场景)”,并且特定卡的数量保留在牌组中。但是当我编写我的python代码时,我意识到所有的卡值都等于8.现在,我知道有些东西不对,但我是python的新手,我想知道为什么我会产生如此毁灭性的结果< / p>

代码示例:

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&#39;”,“K&#39; K&#39;或者&#39; Q&#39;该值应设置为10,其他应设置为列表[1,11]。最后,finally应该将值赋给与该键对应的值

2 个答案:

答案 0 :(得分:0)

您的初始“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])

答案 1 :(得分:0)

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

更好的解决方案是设置一个空的dict,然后迭代通过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}