Подтвердить что ты не робот

Союз объектов dict в Python

Как вы вычисляете объединение двух объектов dict в Python, где пара (key, value) присутствует в результате iff key is in либо dict (если только нет дубликатов)?

Например, объединение {'a' : 0, 'b' : 1} и {'c' : 2} равно {'a' : 0, 'b' : 1, 'c' : 2}.

Вы можете сделать это без изменения ввода dict. Пример того, где это полезно: Получить список всех переменных, находящихся в настоящее время в области и их значениях

4b9b3361

Ответ 1

Этот вопрос содержит идиому. Вы используете один из аргументов в качестве аргументов ключевого слова конструктору dict():

dict(y, **x)

Дубликаты разрешаются в пользу значения в x; например

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}

Ответ 2

Вы также можете использовать update метод dict, например

a = {'a' : 0, 'b' : 1}
b = {'c' : 2}

a.update(b)
print a

Ответ 3

Два словаря

def union2(dict1, dict2):
    return dict(list(dict1.items()) + list(dict2.items()))

n словарей

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))

Ответ 4

Если вам нужно, чтобы оба dicts оставались независимыми и обновлялись, вы можете создать один объект, который запрашивает оба словаря в своем методе __getitem__ (и реализует get, __contains__ и другой метод сопоставления по мере необходимости).

Пример минимализма может быть таким:

class UDict(object):
   def __init__(self, d1, d2):
       self.d1, self.d2 = d1, d2
   def __getitem__(self, item):
       if item in self.d1:
           return self.d1[item]
       return self.d2[item]

И он работает:

>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __getitem__
KeyError: 3
>>>