首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代python中的dict并不会产生预期的结果。

迭代python中的dict并不会产生预期的结果。
EN

Stack Overflow用户
提问于 2016-01-31 10:48:39
回答 2查看 54关注 0票数 2

我正试图在python中建立一套卡片,但我试图将所有的信息存储在字典中。我需要存储卡名(例如,2,4,'K‘代表国王,'J’代表杰克等),该卡值值为黑杰克(即2值2,A值1或11,视情况而定),以及该特定卡的数量留在甲板上。然而,当我编写python代码时,我意识到所有的卡值都等于8。

代码示例:

代码语言:javascript
复制
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。所有漂亮卡片(杰克、国王和王后)的值都是10,所以如果键是'J','K‘或'Q’,那么这个值应该设置为10,其他值应该设置为列表1,11。最后,最后应该将值赋给与该键对应的值。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-31 10:58:16

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

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

此外,您应该始终避免空白,除非;捕获您期望的错误,在本例中,错误仅为ValueError。而且,这并不是对finally的有效使用;只需删除它并取消对块的缩进。

代码语言:javascript
复制
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}
票数 0
EN

Stack Overflow用户

发布于 2016-01-31 10:58:01

初始的“dict键”语句将所有值设置为同一个dict对象。您可以通过以下方式演示这一点:

代码语言:javascript
复制
print bj.deck['3'] is bj.deck['4']
# prints True

因为这些值都是对同一个dict的引用,所以您解析的最后一个键"8“变成了这个dict的"value”。

您可以通过为每个键创建一个单独的dict来解决这个问题:

代码语言:javascript
复制
self.deck = dict([(k, {'total': 4, 'value': 0}) 
                 for k in self.deck_list])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35112955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档