2016-10-17 216 views
1

这将是一个非常令人尴尬的从我第一篇文章 - 只是在学习基础知识〜6个月前回到Python编码,而不是从那时起使用它。通过键和值列表访问字典键和值

我编码在面向对象的方法二十一点游戏,并定义了甲板对象,如下所示:

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 

的问题是,代码只是没有做什么,我认为它应该做的(如例如:从第一件西装上拉lf.suits列表,使用它作为字典的名称迭代其所有键并将其关联值设置为1)。相反,我只是得到一个错误“AttributeError:'甲板'对象没有属性'西装'”。

我在这里做错了什么?有没有一种利用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

可以使用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()) 
+0

非常感谢你为这个做的 - 第一个解决方案工作像一个奇迹! – Greem666

+0

只是出于好奇 - 为什么我最初的代码不工作?从程序的流程来看,它应该有字典的名称和关键字在第二个循环的动作空间中设置为1,但它并没有把它放在一起......即使只是一个链接到涵盖该主题的文章将不胜感激。 – Greem666

+0

@ Greem666问题是,当你做你的“self.suit”它指的是你的对象的“西装”属性,而你的变量“西装”链接到一些字符串。要通过名称从对象获取属性,您应该使用函数“getattr”。不知道是否有一篇很好的文章可以解决这个问题。 – Alex