创建结合两个其他字典的字典

问题描述:

从两个其他字典(非常大和小)创建字典的最佳方法是什么?创建结合两个其他字典的字典

我们:

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都有值。 –

下面的代码工作在所示的所有情况下(例如驾驶员价值),并采取更多面向方法。

>>> 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他们看起来像我的花车... –

你可以使用字典解析:

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

如果有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

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}