python - Comment fusionner deux dictionnaires dans une seule expression (union des dictionnaires)

Mots clés : pythondictionarymergepython

meilleur 5 Réponses python - Comment fusionner deux dictionnaires dans une seule expression (union des dictionnaires)

vote vote

94

z = x | y          # NOTE: 3.9+ ONLY 
z = {**x, **y} 
def merge_two_dicts(x, y):     z = x.copy()   # start with keys and values of x     z.update(y)    # modifies z with keys and values of y     return z 
z = merge_two_dicts(x, y) 
x = {'a': 1, 'b': 2} y = {'b': 3, 'c': 4} 
>>> z {'a': 1, 'b': 3, 'c': 4} 
z = {**x, **y} 
z = {**x, 'foo': 1, 'bar': 2, **y} 
>>> z {'a': 1, 'b': 3, 'foo': 1, 'bar': 2, 'c': 4} 
z = x.copy() z.update(y) # which returns None since it mutates z 
def merge_two_dicts(x, y):     """Given two dictionaries, merge them into a new dict as a shallow copy."""     z = x.copy()     z.update(y)     return z 
z = merge_two_dicts(x, y) 
def merge_dicts(*dict_args):     """     Given any number of dictionaries, shallow copy and merge into a new dict,     precedence goes to key-value pairs in latter dictionaries.     """     result = {}     for dictionary in dict_args:         result.update(dictionary)     return result 
z = merge_dicts(a, b, c, d, e, f, g)  
z = dict(x.items() + y.items()) 
>>> c = dict(a.items() + b.items()) Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items' 
>>> c = dict(a.items() | b.items()) 
>>> x = {'a': []} >>> y = {'b': []} >>> dict(x.items() | y.items()) Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' 
>>> x = {'a': 2} >>> y = {'a': 1} >>> dict(x.items() | y.items()) {'a': 2} 
z = dict(x, **y) 
>>> c = dict(a, **b) Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: keyword arguments must be strings 
dict(a=1, b=10, c=11) 
{'a': 1, 'b': 10, 'c': 11} 
>>> foo(**{('a', 'b'): None}) Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: foo() keywords must be strings >>> dict(**{('a', 'b'): None}) {('a', 'b'): None} 
from copy import deepcopy  def dict_of_dicts_merge(x, y):     z = {}     overlapping_keys = x.keys() & y.keys()     for key in overlapping_keys:         z[key] = dict_of_dicts_merge(x[key], y[key])     for key in x.keys() - overlapping_keys:         z[key] = deepcopy(x[key])     for key in y.keys() - overlapping_keys:         z[key] = deepcopy(y[key])     return z 
>>> x = {'a':{1:{}}, 'b': {2:{}}} >>> y = {'b':{10:{}}, 'c': {11:{}}} >>> dict_of_dicts_merge(x, y) {'b': {2: {}, 10: {}}, 'a': {1: {}}, 'c': {11: {}}} 
{k: v for d in dicts for k, v in d.items()} # iteritems in Python 2.7 
dict((k, v) for d in dicts for k, v in d.items()) # iteritems in Python 2 
from itertools import chain z = dict(chain(x.items(), y.items())) # iteritems in Python 2 
from timeit import repeat from itertools import chain  x = dict.fromkeys('abcdefg') y = dict.fromkeys('efghijk')  def merge_two_dicts(x, y):     z = x.copy()     z.update(y)     return z  min(repeat(lambda: {**x, **y})) min(repeat(lambda: merge_two_dicts(x, y))) min(repeat(lambda: {k: v for d in (x, y) for k, v in d.items()})) min(repeat(lambda: dict(chain(x.items(), y.items())))) min(repeat(lambda: dict(item for d in (x, y) for item in d.items()))) 
>>> min(repeat(lambda: {**x, **y})) 1.0804965235292912 >>> min(repeat(lambda: merge_two_dicts(x, y))) 1.636518670246005 >>> min(repeat(lambda: {k: v for d in (x, y) for k, v in d.items()})) 3.1779992282390594 >>> min(repeat(lambda: dict(chain(x.items(), y.items())))) 2.740647904574871 >>> min(repeat(lambda: dict(item for d in (x, y) for item in d.items()))) 4.266070580109954 
$ uname -a Linux nixos 4.19.113 #1-NixOS SMP Wed Mar 25 07:06:15 UTC 2020 x86_64 GNU/Linux 
vote vote

81

z = dict(list(x.items()) + list(y.items())) 
>>> x = {'a':1, 'b': 2} >>> y = {'b':10, 'c': 11} >>> z = dict(list(x.items()) + list(y.items())) >>> z {'a': 1, 'c': 11, 'b': 10}  
>>> z = dict(x.items() + y.items()) >>> z {'a': 1, 'c': 11, 'b': 10} 
x = {'a':1, 'b': 2} y = {'b':10, 'c': 11} z = x | y print(z) 
{'a': 1, 'c': 11, 'b': 10} 
vote vote

71

z = x.copy() z.update(y) 
vote vote

66

z = dict(x, **y) 
vote vote

57

>>> timeit.Timer("dict(x, **y)", "x = dict(zip(range(1000), range(1000)))\ny=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000) 15.52571702003479 >>> timeit.Timer("temp = x.copy()\ntemp.update(y)", "x = dict(zip(range(1000), range(1000)))\ny=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000) 15.694622993469238 >>> timeit.Timer("dict(x.items() + y.items())", "x = dict(zip(range(1000), range(1000)))\ny=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000) 41.484580039978027 

Questions similaires