2012-08-04 55 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)))