Python-如何合并而不是用字符串作为键和值更新两个字典作为字符串列表?

时间:2017-04-07 13:17:45

标签: python dictionary merge concatenation

给出两个词典:

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

我一直坚持如何连接这些项目。

4 个答案:

答案 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']}