使用python中的嵌套for循环加载字典



我只是在学习python(有VBA背景)。

为什么这本字典没有加载?我正在努力想出一副完整的牌。

这是我的代码:

class Deck:
    def load_deck(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = (2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King", "Ace")
        full_deck={}
        for s in suite:
            for r in rank:
                full_deck.setdefault(s,r)
        return full_deck
raw_deck = Deck()
raw_deck1 = raw_deck.load_deck()
print raw_deck1

这是我的输出:

{'Hearts': 2, 'Clubs': 2, 'Spades': 2, 'Diamonds': 2}
JBernardo的注释为您提供了setdefault()的正确用法,但您可以将循环简化为以下内容:
full_deck = {}
for s in suite:
    full_deck[s] = rank

或者,如果您想要一个列表而不是元组,请使用list(rank)

一个衬垫:

full_deck = {s: rank for s in suite}

Python 2.6或更低版本:

full_deck = dict((s, rank) for s in suite)

您正在制作的方法实际上不需要在一个类中,这取决于您试图做什么…如果您只是试图填充字典,那么您可以分配值,而不是使用setdefault()方法(如上所述)。

你可以这么简单地做:

cards = {}
for suit in ('Heart', 'Club', 'Spade', 'Diamond'): 
    cards[suit] = range(2, 11) + ['Jack', 'Queen', 'King', 'Ace']
print cards

如果您试图用信息填充一个新的类类型,那么您应该定义一个init函数(在Python中充当类构造函数)来创建和存储新的成员变量,即:

class Deck:
    def __init__( self ):
        self._cards = {}
        for suit in ('Heart', 'Club', 'Spade', 'Diamond'):
            self._cards[suit] = range(2, 11) + ['Jack', 'Queen', 'King', 'Ace']
    def cards( self ):
        return self._cards
deck = Deck()
print deck.cards()

以下是在Python 2.7中实现这一点的有效方法,它支持字典理解

def load_deck():
    suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
    rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
    return {item[0]:item[1] for item in enumerate(((r,s) for r in rank for s in suite))}

对于Python<2.7您需要使用另一个生成器表达式dict类构造函数,如下所示:

def load_deck():
    suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
    rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
    return dict((item[0],item[1])
                for item in enumerate(((r,s) for r in rank for s in suite)))

使用@ernie的响应,指出我需要一个字典,其中有52个单独的对,我想出了以下方法,它可以满足我的需求。

def load_deck():
    suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
    rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
    full_deck = {}
    i = 0
    for s in suite:
        for r in rank:
            full_deck[i] = r,s  # took this solution from the comment below.  it works.
            i += 1
    return full_deck
print load_deck()

最新更新