Вы можете всегда обернуть его в функции:
def multiassign(d, keys, values):
d.update(zip(keys, values))
Даже если вы не знали о update
, вы могли бы написать это следующим образом:
def multiassign(d, keys, values):
for k, v in zip(keys, values):
d[k] = v
Или вы даже можете написать dict
подкласс, который дает вам точно синтаксис, который вы хотели:
class EasyDict(dict):
def __getitem__(self, key):
if isinstance(key, tuple):
return [super().__getitem__(k) for k in key]
else:
return super().__getitem__(key)
def __setitem__(self, key, value):
if isinstance(key, tuple):
self.update(zip(key, value))
else:
super().__setitem__(key, value)
def __delitem__(self, key, value):
if isinstance(key, tuple):
for k in key: super().__delitem__(k)
else:
super().__setitem__(key, value)
Сейчас:
>>> d = {'a': 1, 'd': 4}
>>> multiassign(d, ['a', 'b', 'c'], [10, 200, 300])
>>> d
{'a': 10, 'b': 200, 'c': 300, 'd': 4}
>>> d2 = EasyDict({'a': 1, 'd': 4})
>>> d2['a', 'b', 'c'] = 100, 200, 300
>>> d2
{'a': 10, 'b': 200, 'c': 300, 'd': 4}
Просто быть в курсе, что он не будет, очевидно, больше не возможно для использования кортежей как ключей в EasyDict
.
Кроме того, если вы собираетесь использовать это для чего-то серьезного, вы, вероятно, захотите улучшить обработку ошибок. (d['a', 'b'] = 1
даст зашифрованное сообщение о zip argument #2 must support iteration
, d['a', 'b', 'c'] = 1, 2
будет молча работать и не делать ничего c
и т.д.)
Yup, это уверенный работ. Я знал 'update()', но ... Спасибо. – ozi
Вы также можете записать это как 'd.update (a = 10, b = 200, c = 300)', если ключи являются действительными идентификаторами (как вы можете в конструкторе). – abarnert
@abarnert да хорошее предложение :) –