2017-01-19 25 views
1

私は4つの項目があります。辞書に辞書を追加する方法

item['bigCtgr'] = 'item' 
item['smaCtgr'] = 'food' 
item['ssCtgr'] = 'apple' 
item['sCtgr'] = 'red' 

と私はprocess_itemに何度も追加します。 だから私はこのような構造にしたい。 カテゴリ

{"item" : 
    {"food": 
     {"apple": 
      {"green":NULL}, 
      {"red":NULL}}, 
     {"banana": 
      {"yellow":NULL}, 
      {"green":NULL}}, 
    } 
    {"sweet": 
     {"candy": 
      {"yellow":NULL}} 
    } 
} 

ような何かが、私のコードは動作していないと私は理由を知りません。

class CategoryPipeline(object): 
    global ctgr 
    ctgr = {} 

    def __init__(self): 
     global file 
     file = open("test.json","w") 

    def process_item(self, item, spider): 

     if item['bigCtgr'] not in ctgr.keys(): 
      ctgr[item['bigCtgr']] = {item['smaCtgr']: {item['ssCtgr'] : {item['sCtgr'] : 'NULL'}}} 
     if item['smaCtgr'] not in ctgr[item['bigCtgr']].keys(): 
      ctgr[item['bigCtgr']][item['smaCtgr']] = {item['ssCtgr']: {item['sCtgr'] : 'NULL'}} 
     elif item['ssCtgr'] not in ctgr[item['bigCtgr']][item['smaCtgr']].keys(): 
      ctgr[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']] = {item['sCtgr'] : 'NULL'} 
     else: 
      ctgr[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']][item['sCtgr']] = 'NULL' 


    def __del__(self): 
     b = json.dumps(ctgr, ensure_ascii=False).encode('utf-8') 
     file.write(b) 
     file.write('\n') 
     file.close() 

コードを作成するにはどうすればよいですか?

+0

明確ではありません。この機能を発見した方法であるノードを追加します'NULL'、' bigCtgr'の意味は何ですか –

+0

辞書だけを使って階層構造を作りたいだけです。 – Amily

+0

サンプル入力と期待される出力として与えることができますか?あなたに答えを与えるために –

答えて

2

私はdictと__missing__機能を持つツリーを実装しました。それは

import json 

class CategoryNode(dict): 
    def __missing__(self,key): 
     self[key] = CategoryNode() 
     return self[key] 
    def add_item(self, item): 
     self[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']][item['sCtgr']] = CategoryNode() 



class CategoryPipeline(object): 
    ctgr = CategoryNode() 
    file = "test.json" 

    def process_item(self, item, spider): 
     CategoryPipeline.ctgr.add_item(item) 

    def json(self): 
     json.dump(CategoryPipeline.ctgr,open(CategoryPipeline.file,'w'), ensure_ascii=False, encoding='utf-8') 

存在しない場合、これはあなたがバレスなどがしたいですか、これはあなたがそれを

cp = CategoryPipeline() 
item = {} 
item['bigCtgr'] = 'item' 
item['smaCtgr'] = 'food' 
item['ssCtgr'] = 'apple' 
item['sCtgr'] = 'red' 
item2 = {} 
item2['bigCtgr'] = 'item' 
item2['smaCtgr'] = 'food' 
item2['ssCtgr'] = 'Orange' 
item2['sCtgr'] = 'orange' 
cp.process_item(item,"Yo") 
cp.process_item(item2,"Yo") 
cp.json() 
+0

本当に本当にありがとう、 私はこの方法を試してみましょう! – Amily

+0

私はコードも少し掃除しました。それが問題を解決するのに役立った場合、答えを受け入れる –

0

を使用することができ、また、私は

class CategoryPipeline(object): 
    global inf_dict, ctgr 
    inf_dict = lambda: collections.defaultdict(inf_dict) 
    ctgr = inf_dict() 

    def __init__(self): 
     global file 
     file = open("test.json","w") 

    def process_item(self, item, spider): 
     ctgr[item['bigCtgr']][item['smaCtgr']][item['ssCtgr']][item['sCtgr']] = 'NULL' 


    def __del__(self): 
     b = json.dumps(ctgr, ensure_ascii=False).encode('utf-8') 
     file.write(b) 
     file.write('\n') 
     file.close() 
関連する問題