2016-03-15 118 views
0

我目前正在編寫一個函數,它需要一個具有不可變值的字典並返回一個反轉字典。到目前爲止,我的代碼越來越極其簡單的試驗權,但它仍然有一些扭結制定出Python倒詞典

def dict_invert(d): 

    inv_map = {v: k for k, v in d.items()} 

    return inv_map 

    list1 = [1,2,3,4,5,6,7,8] 
    list2 = {[1]:3245,[2]:4356,[3]:6578} 
    d = {['a']:[],['b']:[]} 
    d['a'].append(list1) 
    d['b'].append(list2) 

如何解決我的代碼,以便它通過測試案例?

我唯一的想法是將列表2改爲[1:32, 2:43, 3:54, 4:65];然而,我仍然有"[]"在正確的位置有問題。我不知道該怎麼做。

+0

返回語句後的所有內容是什麼? –

+3

你的名字很奇怪的'list2'和你的'd'甚至不應該運行:列表是不可散列的,所以你不能使用它們作爲字典鍵。 – DSM

+0

@DSM - 這也是我的第一個想法,但如果他們真的是在返回聲明之後,那麼他們就不會運行(這可能解釋爲什麼一些測試會通過?) – mgilson

回答

3

訣竅是要認識到多個鍵可以具有相同的值,所以當反轉時,您必須確保您的值映射到鍵列表。

from collections import defaultdict 

def dict_invert(d): 
    inv_map = defaultdict(list) 
    for k, v in d.items(): 
    inv_map[v].append(k) 
    return inv_map 

編輯:

只是增加了一點更有幫助信息...

defaultdict(list)使得字典的默認值= list()當通過[]get訪問(通常時它會分別增加KeyError或返回None)。

有了這一defaultdict,你可以使用一些邏輯來組鍵一起......這裏有一個例子來說明(從上面我的意見)

原字典:K0 - > V0,K1 - > V0,K2 - > V0

應該反轉爲:V0 - > [K0,K1,K2]

編輯2:

你的測試,似乎迫使你到使用正常的字典,在這種情況下......

def dict_invert(d): 
    inv_map = {} 
    for k, v in d.items(): 
     if v not in inv_map: 
      inv_map[v] = [] 
     inv_map[v].append(k) 
    return inv_map 
+0

現在它爲每個測試輸出defaultdict(,{})。任何想法爲什麼這樣做?我需要添加一個dict.get嗎? – user6067378