Обновите словарь Python с произвольно длинным списком значений
У меня есть рабочая проблема, в которой мне нужно было иметь возможность обновлять значения в словаре из произвольно длинного списка ключей. И список ключей, и словарь генерируются из одних и тех же данных во время выполнения, но я не знаю, сколько ключей будет в данных раньше. Список ключей для получения данных определяется пользователем во время выполнения.
Итак, это работает для того, чтобы иметь возможность обновлять значения в словаре из информации списка, состоящей из: 1. списка ключей, упорядоченного в том же порядке, что и вложенность ключей в словаре 2. значения, которое нужно обновить в соответствии с этот список ключей информации.
1 ответ
Я думаю, что у меня есть решение путем очистки с этого сайта: https://gist.github.com/hrldcpr/2012250, а также python autoviv(), который мне понравился больше, чем этот объект дерева по умолчанию.
Вот мое решение. В зависимости от того, что вы используете для функции, вы должны иметь возможность генерировать словарь из списка (ов) и / или обновлять значение в определенном месте в структуре.
Если вы заметите явные ошибки или возможности для улучшения, я был бы признателен за ваш конструктивный отзыв.
from pprint import *
from collections import defaultdict
from operator import getitem
class autoviv(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
def add(t,path,genorupdate='generate',val=0):
if genorupdate=='generate':
for node in path:
t = t[node]
elif genorupdate=='update':
for node in path:
if path.index(node)==len(path)-1:
t[node]=val
t = t[node]
d=autoviv()
# test lists to generate dictionary
l=['a','b','c']
l2=['a','b','d']
# TEST 1: generate dictionary with 2 kvps: c and d, nested under b:
add(d,l)
add(d,l2)
for k in d.keys():
print k, d[k]
# RESULT: a {'b': {'c': {}, 'd': {}}}
# TEST 2, update the value for the a,b,d key to 2 w/o disturbing anything else or
# generating additional structure
add(d,l2,'update',2)
for k in d.keys():
print k, d[k]
# RESULT: a {'b': {'c': {}, 'd': 2}}