Python 访问字典键&;通过键和值列表显示的值

Python 访问字典键&;通过键和值列表显示的值,python,dictionary,iteration,Python,Dictionary,Iteration,这将是我的第一篇非常尴尬的帖子——在6个月前学习了基本知识之后,又回到Python编码上来,从那时起就不再使用它了 我正在用面向对象的方法编写一个21点游戏,并定义了一个甲板对象,如下所示: class Deck(object): suits = ["spades", "clubs", "diamonds", "hearts"] ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "Kin

这将是我的第一篇非常尴尬的帖子——在6个月前学习了基本知识之后,又回到Python编码上来,从那时起就不再使用它了

我正在用面向对象的方法编写一个21点游戏,并定义了一个甲板对象,如下所示:

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列表中提取第一个suit,使用它作为字典的名称,迭代所有键并将它们的关联值设置为1)。相反,我只得到一个错误“AttributeError:‘Deck’对象没有属性‘suit’”

我在这里做错了什么?有没有一种简洁的方法,用两个嵌套的循环来写我想写的东西,而不是像下面这样写

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
我知道这可能是一个非常基本的问题


干杯

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

非常感谢您的帮助-第一个解决方案工作得很好!只是出于好奇-为什么我的初始代码不工作?从程序流程来看,当它在第二个循环的操作空间中时,它应该将字典的名称和关键字都设置为1,但它没有将其组合在一起…甚至只是一个指向n请阅读有关该主题的文章。@Greem666问题是,当您执行“self.suit”时,它指的是对象的“suit”属性,而变量“suit”链接到某个字符串。要从对象中按其名称获取属性,应使用函数“getattr”.不确定是否有一篇好文章介绍了这个问题。