2013-02-14 19 views
6

sto parsing JSON che memorizza i vari frammenti di codice e sto primo edificio di un dizionario di lingue utilizzate da questi frammenti:Update e creare un dizionario multi-dimensionale in Python

snippets = {'python': {}, 'text': {}, 'php': {}, 'js': {}} 

Poi, quando scorrendo il JSON I Sto volendo aggiungere le informazioni sul frammento nel suo dizionario al dizionario sopra elencato. Per esempio, se ho avuto un frammento JS - il risultato finale sarebbe:

snippets = {'js': 
       {"title":"Script 1","code":"code here", "id":"123456"} 
       {"title":"Script 2","code":"code here", "id":"123457"} 
} 

Per non confondere le acque - ma in PHP lavorando su un array multi-dimensionale vorrei solo fare quanto segue (sto lookng per qualcosa di simile):

snippets['js'][] = array here 

so che ho visto una o due persone a parlare di come creare un dizionario multidimensionale - ma non riesco a rintracciare l'aggiunta di un dizionario per un dizionario all'interno di pitone. Grazie per l'aiuto.

risposta

11

questo si chiama autovivification:

si può fare con defaultdict

def tree(): 
    return collections.defaultdict(tree) 

d = tree() 
d['js']['title'] = 'Script1' 

Se l'idea è quella di avere liste, si può fare:

d = collections.defaultdict(list) 
d['js'].append({'foo': 'bar'}) 
d['js'].append({'other': 'thing'}) 

L'idea per defaultdict esso per creare automaticamente l'elemento quando si accede alla chiave. A proposito, per questo semplice caso, puoi semplicemente fare:

d = {} 
d['js'] = [{'foo': 'bar'}, {'other': 'thing'}] 
+0

Questo è quello che stavo per suggerire, ma dal suo secondo frammento di codice sembra che voglia "js" restituire una lista di dict. – placeybordeaux

+0

@placeybordeaux Non mi piace molto [php] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/), ma sono piuttosto sicuro che il loro oggetto "Array" può comportarsi come lista o come dict a seconda della posizione della luna o qualcosa del genere ... – JBernardo

+0

Non ho amore per PHP, ma mi riferivo a 'snippets = {'js': {" id ":" 3 "} {" id ":" 2 "}}', sembra che voglia una lista di dts allegata a js, text, python ecc. Adoro i defaultdicts e ancor più i defaultdict definiti in modo ricorsivo, ma sembra come se non funzionassero esattamente per quello che vuole. – placeybordeaux

6

Da

snippets = {'js': 
       {"title":"Script 1","code":"code here", "id":"123456"} 
       {"title":"Script 2","code":"code here", "id":"123457"} 
} 

Sembra a me come si vuole avere una lista di dizionari. Ecco un codice Python che dovrebbe portare a quello che vuoi

snippets = {'python': [], 'text': [], 'php': [], 'js': []} 
snippets['js'].append({"title":"Script 1","code":"code here", "id":"123456"}) 
snippets['js'].append({"title":"Script 1","code":"code here", "id":"123457"}) 
print(snippets['js']) #[{'code': 'code here', 'id': '123456', 'title': 'Script 1'}, {'code': 'code here', 'id': '123457', 'title': 'Script 1'}] 

Questo lo rende chiaro?

+0

sì, questo mi sembra quello di cui ho bisogno, grazie per l'aiuto! – gregwhitworth

+0

Cool, hai bisogno di spiegarlo di più? Per favore ricorda di accettare la risposta se risolve il tuo problema. – placeybordeaux

Problemi correlati