2017-10-21 113 views
-1

從兩個其他字典(非常大和小)創建字典的最佳方法是什麼?創建結合兩個其他字典的字典

我們:

big_dict = { 
    'key1':325, 
    'key2':326, 
    'key3':327, 
    ... 
    } 

    small_dict = { 
    325:0.698, 
    326:0.684, 
    327:0.668 
    } 

需要獲得在small_dict數據字典,但我們應該從big_dict使用鍵:

comb_dict = { 
    'key1':0.698, 
    'key2':0.684, 
    'key3':0.668 
    } 
+1

應該發生什麼,如果來回價值m'big_dict'不是'small_dict'中的關鍵字嗎? –

+0

這是一個好點。但是在這個實際任務中,兩個字符都來自一個函數(TfidfVectorizer())。所以在這種情況下,small_dict的每個鍵的big_dict都有值。 –

回答

2

下面的代碼工作在所示的所有情況下(例如駕駛員價值),並採取更多面向方法。

>>> d = {} 
>>> for key,val in big_dict.items(): 
     try: 
      d[key] = small_dict[val] 
     except KeyError: 
      continue 

=> {'key1': 0.698, 'key2': 0.684, 'key3': 0.668} 

#driver值:

IN : big_dict = { 
     'key1':325, 
     'key2':326, 
     'key3':327, 
     'key4':330  #note that small_dict[330] will give KeyError 
    } 

IN : small_dict = { 
      325:0.698, 
      326:0.684, 
      327:0.668 
     } 

或者,使用Dictionary Comprehension

>>> {key:small_dict[val] for key,val in big_dict.items() if val in small_dict} 

=> {'key1': 0.698, 'key2': 0.684, 'key3': 0.668} 
+0

'd [key] = small_dict [val]'應該可能是'd [key] = deepcopy(small_dict [val])'。如果small_dict的cal不是一個不可變的對象(string,int,ect ...),如果下一行使用append()(如果它是一個列表)或任何其他對象特定方法更改了'd [key]有改變'small_dict'的副作用。另外,如果對不可變對象調用deepcopy(),則幾乎不會有性能損失。 Python仍然會像正常的'='一樣保持內存引用。 – PeterH

+0

@PeterH他們看起來像我的花車... –

1

你可以使用字典解析:

comb_dict = {k: small_dict[v] for k, v in big_dict.iteritems()} 

如果big_dict可能包含的值未在small_dict鍵,你可以不理會他們:

comb_dict = {k: small_dict[v] for k, v in big_dict.iteritems() if v in small_dict} 

或使用原始值:

{k: (small_dict[v] if v in small_dict else v) for k, v in big_dict.iteritems()} 

(使用items()在Python3)

+0

理解很酷,但他們有時難以閱讀。特別是最後一個帶有三元表達式的例子 - 你可能不想在生產代碼中這樣做。 – 2017-10-21 20:01:11

+0

@Wyatt我同意關於三元表達,我補充說完整性。我添加了括號以使其更具可讀性。 – Neo

1

如果有big_dict值可能不存在作爲small_dict中的鍵,這將工作:

combined_dict = {} 
for big_key, small_key in big_dict.items(): 
    combined_dict[big_key] = small_dict.get(small_key) 

或者你可能想用而使用不同的默認值:

combined_dict[big_key] = small_dict.get(small_key, default='XXX') 

或者你可能想提出KeyError來表明您的數據的問題:

combined_dict[big_key] = small_dict[small_key] 

或者你可能想跳過丟失的鑰匙:

if small_key in small_dict: 
     combined_dict[big_key] = small_dict[small_key] 
+1

這樣做的一個問題是,如果'small_dict [small_key]'有一個複雜對象(dict,list,ect ...)的值,那麼當您執行'combined_dict [big_key] = small_dict [small_key]'時,您會給出combined_dict指向small_dicts數據的指針。因此,如果您更改了combined_dict數據,它也會在small_dict中更改它。一個簡單的'deepcopy()'值集可以解決它。 – PeterH

+0

@PeterH這是一個好點,但我無法解決所有可能的情況;) – 2017-10-21 19:53:44

0
keys = small_dict.keys() 
combined_dict = {k:small_dict[v] for k,v in big_dict.items() if v in keys} 
>>> combined_dict 
{'key3': 0.668, 'key2': 0.684, 'key1': 0.698}