2013-02-14 21 views
6

ja parsowania JSON, który przechowuje różne fragmenty kodu, a ja najpierw buduje słownika języków używanych przez te fragmenty:Update i tworzyć wielowymiarowe słownika w Pythonie

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

Potem, gdy zapętlenie przez JSON I Chciałbym dodać informację o fragmencie kodu do własnego słownika do słownika wymienionego powyżej. Na przykład, gdybym miał urywek JS - końcowy wynik będzie:

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

Nie błotnistej wody - ale w PHP działa na wielowymiarowej tablicy I po prostu wykonaj następujące czynności (jestem lookng dla coś podobny):

snippets['js'][] = array here 

wiem widziałem jedna lub dwie osoby mówią o tym jak stworzyć wielowymiarową słownika - ale nie wydaje się wyśledzić dodanie słownik do słownika w Pythonie. Dzięki za pomoc.

Odpowiedz

11

To się nazywa autovivification:

Można to zrobić z defaultdict

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

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

Jeśli chodzi o to, aby mieć listę, możesz zrobić:

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

Pomysł defaultdict to aby automatycznie utworzyć element po uzyskaniu dostępu do klucza. BTW, dla tego prostego przypadku, możesz po prostu zrobić:

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

To właśnie zamierzałem zasugerować, ale z drugiego fragmentu kodu wygląda na to, że chce "js", aby zwrócić listę dykt. – placeybordeaux

+0

@placeybordeaux Naprawdę nie lubię [php] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/), ale jestem całkiem Na pewno ich obiekt "Array" może zachowywać się jak lista lub dyktować w zależności od pozycji księżyca lub czegoś podobnego ... – JBernardo

+0

Nie mam zamiłowania do PHP, ale miałem na myśli 'snippets = {'js': {" id ":" 3 "} {" id ":" 2 "}}', wygląda na to, że chce listy załączników dołączonych do js, ​​text, python itp. Uwielbiam defaultdicts i jeszcze bardziej tak rekurencyjnie zdefiniowane defaultdicts, ale wygląda tak jakby nie działały dokładnie tak, jak chce. – placeybordeaux

6

Od

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

ona patrzy na mnie jak chcesz mieć listę słowników. Oto niektóre kodu Pythona, który powinien doprowadzić do tego, co mam nadzieję, że chcesz

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'}] 

robi jasno?

+0

Tak, to wygląda na to, co będę potrzebować, dziękuję za pomoc! – gregwhitworth

+0

Fajnie, czy potrzebujesz czegoś więcej? Pamiętaj, aby zaakceptować odpowiedź, jeśli rozwiąże ona Twój problem. – placeybordeaux

Powiązane problemy