2012-08-04 54 views
2

我刚学习python(在VBA中有一个背景)。在python中使用嵌套for循环加载字典

为什么不是这本字典加载?我试图拿出一整套牌。

这里是我的代码:

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} 
+3

这不是setdefault应该解释】句子e used ...'d.setdefault(s,[])。append(r)'是你想要的 – JBernardo 2012-08-04 00:05:36

+1

你想要什么输出? – vergenzt 2012-08-04 00:12:04

+0

我正在尝试创建一个完整的卡片组字典。 – dwstein 2012-08-04 00:14:07

回答

3

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) 
+0

这会创建分隔列表而不是单个字典对。 – dwstein 2012-08-04 00:19:22

+0

@dwstein - 这应该创建一个字典,看起来像'{'Hearts':(2,3,4,...),'Clubs':(2,3,4,...),...} ' – 2012-08-04 00:20:46

+0

正确。但我正在努力做{'2':'心','3':'心'等....} – dwstein 2012-08-04 01:00:36

1

你正在做的方法并不真正需要的是一类 - 这取决于你正在尝试要做...如果你只是想填充字典,那么你可以分配值而不是使用setdefault()方法(如上所述)。

你可能只是做简单,如本:

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

如果你想填充新的类类型的信息,那么你应该定义一个初始化功能(充当类的构造函数在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() 
+0

__init __()是做什么的?我从未能够理解这一点。 – dwstein 2012-08-04 01:01:30

+0

@dwstein:我googled“蟒蛇什么是初始化”,这是第一次打击:http://stackoverflow.com/questions/625083/python-init-and-self-what-do-they-do – Lenna 2012-08-04 02:19:35

0

运用@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() 
+0

字典你'创建只需键入0到51之间的整数。您不需要使用'setdefault()'来填充它,并且根本不需要'deck_list'变量 - 只需将'full_deck [i] = r,s',然后加上'i + = 1',它将设置返回字典中与每个索引相关的值。使用字典解析来编写这样一个循环的方法有些简短,就像其他一些提到的答案一样。 – martineau 2012-08-04 03:16:35

+0

对吧!简单得多。 – dwstein 2012-08-04 03:33:14

0

这里是做在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)))