Я пытаюсь добавить элементы в несколько ключей словаря в цикле. Тем не менее, сейчас я вижу только длинный способ сделать это - отдельная строка для каждого обновления ключа, например:
# My dictionary
my_dict = {'Key1': [0], 'Key2': [0], 'Key3': [0]}
# Show initial state
print(my_dict)
# Populate dictionary with new elements
for i in range(1, 5):
my_dict['Key1'].append(i)
my_dict['Key2'].append(-i)
my_dict['Key3'].append(i^2)
# Show final result
print(my_dict)
который дает желаемый
{'Key1': [0, 1, 2, 3, 4], 'Key2': [0, -1, -2, -3, -4], 'Key3': [0, 3, 0, 1, 6]}
Однако мне хотелось бы добавить все эти новые элементы в одну строку:
for i in range(1, 5):
my_dict['Key1', 'Key2', 'Key3'].append(i, -i, i^2)
Там есть множество способов, которыми вы могли бы приблизиться к этому, но, не слишком притягаясь, это тот первый способ, который приходит на ум.
Обратите внимание, что вам придется поддерживать постоянно расширяющийся список операций для ключей по мере их обновления.
# My dictionary
my_dict = {'key1': [0], 'key2': [0], 'key3': [0]}
# Show initial state
print(my_dict)
# Populate dictionary with new elements
for i in range(1, 5):
key_update_operation = {'key1': i, 'key2': -i, 'key3': i^2}
for k, v in my_dict.items():
my_dict[k].append(key_update_operation[k])
# Show final result
print(my_dict)
Я думаю, это в основном то, что предлагает Аран-Фей. Имейте в виду, в то время как этот пример работает очень хорошо, читаемость - это огромная вещь, если вы собираетесь поделиться своим кодом с другими людьми, так что не бойтесь просто держать его просто, не так много, чтобы его можно было получить!
Вы можете создать подкласс dict
и переопределить __getitem__
вернуть объект пользовательского класса, когда аргумент кортеж просто так, что пользовательский класс может иметь на append
метод, добавляемые соответствующие значения для заданных ключей в одном кадре:
class Dict(dict):
class DictView:
def __init__(self, d, keys):
self.d = d
self.keys = keys
def append(self, *items):
for key, item in zip(self.keys, items):
self.d[key].append(item)
def __getitem__(self, key):
if isinstance(key, tuple):
return self.DictView(self, key)
return super().__getitem__(key)
чтобы:
my_dict = Dict({'Key1': [0], 'Key2': [0], 'Key3': [0]})
for i in range(1, 5):
my_dict['Key1', 'Key2', 'Key3'].append(i, -i, i^2)
print(my_dict)
выведет:
{'Key1': [0, 1, 2, 3, 4], 'Key2': [0, -1, -2, -3, -4], 'Key3': [0, 3, 0, 1, 6]}