[英]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.