簡體   English   中英

Python-如何合並而不是用字符串作為鍵和值更新兩個字典作為字符串列表?

[英]Python-how to merge and not update two dictionaries with strings as keys and values as list of strings?

鑒於兩個詞典:

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

我堅持如何連接項目。

您可以使用字典理解創建累積值字典:

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中的.keys替換.viewkeys


時序:

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

深度復制其中一個dicts,根據需要使用其他dict中值的元素擴展值。

>>> from copy import deepcopy
>>> d1={'cardinal':['VA','OH'], 'meadowlark':['OR']}
>>> d2={'meadowlark':['WY'], 'cardinal':['VA', 'IL'], 'oriole':['MD']}
>>> 
>>> d = deepcopy(d1)
>>> for key, lst in d2.items():
...     d.setdefault(key, []).extend(lst)
... 
>>> d
{'meadowlark': ['OR', 'WY'], 'oriole': ['MD'], 'cardinal': ['VA', 'OH', 'VA', 'IL']}
>>> d1
{'meadowlark': ['OR'], 'cardinal': ['VA', 'OH']}
>>> d2
{'meadowlark': ['WY'], 'oriole': ['MD'], 'cardinal': ['VA', 'IL']}

你可以一步一步地做到這一點:

 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

它看起來不酷但它有效:)

除了我們手動進行深度復制之外,此代碼與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']}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM