Python rellena un objeto / diccionario con varias teclas

Tengo una lista de 4 gramos con la que quiero rellenar un objeto de diccionario / objeto shevle con:

['I','go','to','work'] ['I','go','there','often'] ['it','is','nice','being'] ['I','live','in','NY'] ['I','go','to','work'] 

Para que tengamos algo como:

 four_grams['I']['go']['to']['work']=1 

y cualquier 4 gramos recién encontrado se rellena con sus cuatro claves, con el valor 1, y su valor se incrementa si se vuelve a encontrar.

Podrías hacer algo como esto:

 import shelve from collections import defaultdict db = shelve.open('/tmp/db') grams = [ ['I','go','to','work'], ['I','go','there','often'], ['it','is','nice','being'], ['I','live','in','NY'], ['I','go','to','work'], ] for gram in grams: path = db.get(gram[0], defaultdict(int)) def f(path, word): if not word in path: path[word] = defaultdict(int) return path[word] reduce(f, gram[1:-1], path)[gram[-1]] += 1 db[gram[0]] = path print db db.close() 

Simplemente puede crear un método auxiliar que inserta los elementos en un diccionario nested uno a la vez, verificando si el sub-diccionario deseado ya existe o no:

 dict = {} def insert(fourgram): d = dict # reference for el in fourgram[0:-1]: # elements 1-3 if fourgram has 4 elements if el not in d: d[el] = {} # create new, empty dict d = d[el] # move into next level dict if fourgram[-1] in d: d[fourgram[-1]] += 1 # increment existing, or... else: d[fourgram[-1]] = 1 # ...create as 1 first time 

Puedes rellenarlo con tu conjunto de datos como:

 insert(['I','go','to','work']) insert(['I','go','there','often']) insert(['it','is','nice','being']) insert(['I','live','in','NY']) insert(['I','go','to','work']) 

después de lo cual, puede indexar en dict como se desee:

 print( dict['I']['go']['to']['work'] ); # prints 2 print( dict['I']['go']['there']['often'] ); # prints 1 print( dict['it']['is']['nice']['being'] ); # prints 1 print( dict['I']['live']['in']['NY'] ); # prints 1