任意の長いキーのリストから辞書の値を更新できるようにする必要があるという仕事上の問題があります。キー リストとディクショナリの両方が実行時に同じデータから生成されますが、以前にデータに含まれるキーの数はわかりません。データから取得するキーのリストは、実行時にユーザーが指定します。
OK、これは次のものから構成されるリスト情報からディクショナリの値を更新できるようにする必要があるということになります:そのキー リスト情報。
任意の長いキーのリストから辞書の値を更新できるようにする必要があるという仕事上の問題があります。キー リストとディクショナリの両方が実行時に同じデータから生成されますが、以前にデータに含まれるキーの数はわかりません。データから取得するキーのリストは、実行時にユーザーが指定します。
OK、これは次のものから構成されるリスト情報からディクショナリの値を更新できるようにする必要があるということになります:そのキー リスト情報。
このサイトから清掃することで、解決策が得られたと思います: 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}}