创建结合两个其他字典的字典
从两个其他字典(非常大和小)创建字典的最佳方法是什么?创建结合两个其他字典的字典
我们:
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
}
下面的代码工作在所示的所有情况下(例如驾驶员价值),并采取更多面向方法。
>>> 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}
'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
@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)
理解很酷,但他们有时难以阅读。特别是最后一个带有三元表达式的例子 - 你可能不想在生产代码中这样做。 – 2017-10-21 20:01:11
@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]
这样做的一个问题是,如果'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
@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}
应该发生什么,如果来回价值m'big_dict'不是'small_dict'中的关键字吗? –
这是一个好点。但是在这个实际任务中,两个字符都来自一个函数(TfidfVectorizer())。所以在这种情况下,small_dict的每个键的big_dict都有值。 –