2013-04-22 24 views
0

編輯的值對從d1和值是正確包含啞代碼。通過DSM-創作使用鍵Python字典的:從D2

這個問題看似簡單的(在我的腦海)-Solved,我試圖找到一種方法來「更新」一個字典基於另一個字典K,V值對。

虛擬文本:

>>> dict1 = {'hello':'HELLO', 'bye':'BYE', 'right':'RIGHT', 'left':'LEFT'} 
>>> dict2 = {'why':['hello', 'bye'], 'direction': ['left', 'right', 'right', 'right']} 

結果我想: - 簡單地更新dict2包含如果存在dict1的鍵值。

updated_dict = {'why':['HELLO', 'BYE'], 'direction':['LEFT', 'RIGHT', 'RIGHT', 'RIGHT']} 

我試圖做到這一點:

updated_dict = dict() 
for v in dict2.values(): 
    id_list = dict2[v] 
    for uniq_id in id_list: 
     new_id = dict1[uniq_id] 
     if updated_dict.has_key(uniq_id): 
      updated_dict[v].append(uniq_id) 
     else: 
      updated_dict[v] = list() 
      updated_dict[v].append(uniq_id) 

這將無法正常工作,由於unhashable列表。這使我陷入困境,我想不出解決這個問題的辦法,有什麼想法?

注意這是不是一個簡單的小寫字母 - >大寫問題,這是創建捕捉到我的問題的實質只是虛擬的文本。

+0

是否所有需要的不同部分的用逗號分隔嗎? – James 2013-04-22 22:51:12

+0

這更像是字符串替換,而不是更新字典。 {: 'STRING1', '字符串': '字符串' '字符串1'}' – CppLearner 2013-04-22 22:52:27

+0

如果'dict1'包含重疊海誓山盟2值的字符串,如'會發生什麼?除非您可以嚴格限制數據,否則這是一個非常棘手的問題。 – 2013-04-22 22:52:45

回答

4

野生猜想:你在想這樣的事情?

>>> dict1 = {'hello':'HELLO', 'bye':'BYE', 'right':'RIGHT', 'left':'LEFT'} 
>>> dict2 = {'why': ['hello', 'bye'], 
    'direction': ['left', 'right', 'right', 'right'], 
    'example': ["don't replace me", "right"]} 
>>> new_d = {k: [dict1.get(x,x) for x in v] for k,v in dict2.items()} 
>>> new_d 
{'direction': ['LEFT', 'RIGHT', 'RIGHT', 'RIGHT'], 
'why': ['HELLO', 'BYE'], 
'example': ["don't replace me", 'RIGHT']} 

我用字典的get方法,它接受一個默認值,允許你沒有一個替代通過不變的值。

+0

你在哪裏得到列表?它只是原始示例中的字符串。你只是假設他可以把它分解成一個列表?我看到 – CppLearner 2013-04-22 22:59:21

+2

@CppLearner:首先它是一個字符串,然後它變成了一個無效的元組示例,現在它再次是一個字符串,即使OP說「一個具有多個值的鍵(列表)「。你的猜測和我一樣好。 :^) – DSM 2013-04-22 23:00:46

+0

他的確猜測過,我實際上認爲這對我很有用。我沒有看到'.get'。謝謝你給我一個DSM – 2013-04-22 23:01:00

3

可能不是簡單的,但是對於您的示例工作:

>>> m={ x:",".join([dict1[y] for y in dict2[x].split(", ")]) for x in dict2} 

>>> m={ k:",".join([dict1[y] for y in v.split(", ")]) for k,v in dict2.items()} 

結果是一樣的:

>>> m 
>>> {'direction': 'LEFT,RIGHT,RIGHT,RIGHT', 'why': 'HELLO,BYE'}