通过键和值列表访问字典键和值

时间:2016-10-17 11:44:06

标签: python dictionary iteration

这对我来说是一个非常令人尴尬的第一篇文章 - 在6个月前学习基础知识后再回到Python编码,从那时起就不再使用它了。

我在面向对象的方法中编写了一个Blackjack游戏,并定义了一个Deck对象,如下所示:

class Deck(object):
    suits = ["spades", "clubs", "diamonds", "hearts"]
    ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]

def __init__(self):
    self.spades = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
    self.clubs = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
    self.diamonds = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
    self.hearts = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}

之后,我想创建一个简洁的方法来启动这个套牌,通过填写每个套装中的等级数量来填充所有4个字典,通过写下面的内容(这就是我在上面定义的类属性的原因:

def initialize_deck(self):
    for suit in self.suits:
        for rank in self.ranks:
            self.suit[rank] = 1

问题是,代码不执行我认为它应该做的事情(例如:从self.suits列表中拉出第一个套装,使用它作为字典的名称迭代其所有键并设置它们关联值为1)。相反,我只是得到一个错误“AttributeError:'Deck'对象没有属性'suit'”。

我在这里做错了什么?是否有一种巧妙的方式用2个嵌套循环编写我的想法,而不是像下面那样编写它?

def initialize_deck(self):
    for rank in self.ranks:
        self.spades[rank] = 1
    for rank in self.ranks:
        self.clubs[rank] = 1
    for rank in self.ranks:
        self.diamonds[rank] = 1
    for rank in self.ranks:
        self.hearts[rank] = 1

提前感谢我所知道的答案可能是一个非常基本的问题。

干杯

1 个答案:

答案 0 :(得分:1)

您可以使用getattr函数从对象获取属性

def initialize_deck(self):
    for suit in self.suits:
        suit_dict = getattr(self, suit)
        for rank in self.ranks:
            suit_dict[rank] = 1

或者您可以使用setattr

执行此操作
def initialize_deck(self):
    rank_map = {key: 1 for key in self.ranks}
    for suit in self.suits:
        setattr(self, suit, rank_map.copy())