给出两个词典:
d1={'cardinal':['VA','OH'], 'meadowlark':['OR']}
d2={'meadowlark':['WY'], 'cardinal':['VA', 'IL'], 'oriole':['MD']}
如何将它们合并到新词典中不用更新原始词典和连接重复项如下:
new_dict={'cardinal':['VA','OH','VA','IL'],'meadowlark':['OR', 'WY'], 'oriole':['MD']}
我的代码没有正确连接,但现在是:
def merge(d1,d2):
import collections
a=collections.Counter(d1)
b=collections.Counter(d2)
return a+b
我一直坚持如何连接这些项目。
答案 0 :(得分:4)
您可以使用字典理解创建累积值字典:
def merge(d1, d2):
return {k: d1.get(k, []) + d2.get(k, []) for k in d1.viewkeys()|d2.viewkeys()}
print(merge(d1, d2))
# {'meadowlark': ['OR', 'WY'], 'cardinal': ['VA', 'OH', 'VA', 'IL'], 'oriole': ['MD']}
在Python 3中将.viewkeys
替换为.keys
。
时序:
In [11]: %%timeit
...: merge2(d1, d2) # deepcopy-extend, timing for import excluded
...:
...:
100000 loops, best of 3: 11.1 µs per loop
In [13]: %%timeit
...: merge(d1, d2) # dict. comp.
...:
100000 loops, best of 3: 2.32 µs per loop
答案 1 :(得分:3)
深层复制其中一个词组,根据需要使用其他词典中的值元素扩展值。
StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("MY_PROCEDURE_NAME");
storedProcedure.registerStoredProcedureParameter("p_lease_null_me", Integer.class, ParameterMode.INOUT);
storedProcedure.setParameter("p_lease_null_me", null);
storedProcedure.execute();
答案 2 :(得分:1)
你可以一步一步地做到这一点:
d1={'cardinal':['VA','OH'], 'meadowlark':['OR']}
d2={'meadowlark':['WY'], 'cardinal':['VA', 'IL'], 'oriole':['MD']}
new_d = d1.copy()
for k, v in d2.items():
if k not in new_d:
new_d[k] = v
else:
new_d[k] = new_d[k] + v
它看起来不酷但是有效:)
答案 3 :(得分:1)
此代码与timgeb类似,只是我们手动进行深度复制。深层复制是防止改变原始列表所必需的。 dict的浅表副本(例如,使用dict.copy
方法)创建一个新的dict对象,但它重用原始的dict键和值。正如您所注意到的,当值可变时,这可能会导致问题(dict键不应该是可变的)。
def append_dict(new_dict, old_dict):
for k, v in old_dict.items():
new_dict.setdefault(k, []).extend(v)
d1 = {'cardinal':['VA','OH'], 'meadowlark':['OR']}
d2 = {'meadowlark':['WY'], 'cardinal':['VA', 'IL'], 'oriole':['MD']}
new_dict = {}
append_dict(new_dict, d1)
append_dict(new_dict, d2)
print('new', new_dict)
print('d1', d1)
print('d2', d2)
<强>输出强>
new {'cardinal': ['VA', 'OH', 'VA', 'IL'], 'meadowlark': ['OR', 'WY'], 'oriole': ['MD']}
d1 {'cardinal': ['VA', 'OH'], 'meadowlark': ['OR']}
d2 {'meadowlark': ['WY'], 'cardinal': ['VA', 'IL'], 'oriole': ['MD']}