Обновите словарь 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}}
Другие вопросы по тегам