1

JSON形式のデータがあります:

data = {"outfit":{"shirt":"red,"pants":{"jeans":"blue","trousers":"khaki"}}}

見た目が美しくインタラクティブであるため、InfoVisを使用してこのデータを決定木にプロットしようとしています。問題は、グラフが次の形式のJSONデータを取得することです。

data = {id:"nodeOutfit",
    name:"outfit",
    data:{},
    children:[{
        id:"nodeShirt",
        name:"shirt",
        data:{},
        children:[{
            id:"nodeRed",
            name:"red",
                   data:{},
                   children:[]
        }],
     },  {
         id:"nodePants",
         name:"pants",
         data:{},
         children:[{
             id:"nodeJeans",
             name:"jeans",
             data:{},
             children:[{
                    id:"nodeBlue",
                    name:"blue",
                    data:{},
                    children[]
             },{
             id:"nodeTrousers",
             name:"trousers",
             data:{},
             children:[{
                    id:"nodeKhaki",
                    name:"khaki",
                    data:{},
                    children:[]
          }
    }

すべてのキーと値に「id」、「data」、「children」が追加され、すべてのキーと値が「name」であることに注意してください。これらの余分な値を追加するには、再帰関数を作成する必要があるように感じます。これを行う簡単な方法はありますか?

これが私がやりたいことですが、それが正しい方法かどうかはわかりません。すべてのキーと値をループして、適切なものに置き換えます。

for name, list in data.iteritems():
    for dict in list:
        for key, value in dict.items():
            #Need something here which changes the value for each key and values
            #Not sure about the syntax to change "outfit" to name:"outfit" as well as
            #adding id:"nodeOutfit", data:{}, and 'children' before the value

離れているかどうか教えてください。

これが彼らの例ですhttp://philogb.github.com/jit/static/v20/Jit/Examples/Spacetree/example1.html

そしてここにデータがありますhttp://philogb.github.com/jit/static/v20/Jit/Examples/Spacetree/example1.code.html

4

1 に答える 1

1

単純な再帰的ソリューション:

data = {"outfit":{"shirt":"red","pants":{"jeans":"blue","trousers":"khaki"}}}
import json
from collections import OrderedDict

def node(name, children):
    n = OrderedDict()
    n['id'] = 'node' + name.capitalize()
    n['name'] = name
    n['data'] = {}
    n['children'] = children
    return n

def convert(d):
    if type(d) == dict:
        return [node(k, convert(v)) for k, v in d.items()]
    else:
        return [node(d, [])]

print(json.dumps(convert(data), indent=True))

convertを返すのlistではなく、dictを返すことに注意してください。data複数のキーを持っている可能性があります'outfit'

出力:

[
 {{
  "id": "nodeOutfit"、
  「名前」:「衣装」、
  "データ": {}、
  "子供": [
   {{
    "id": "nodeShirt"、
    「名前」:「シャツ」、
    "データ": {}、
    "子供": [
     {{
      "id": "nodeRed"、
      「名前」:「赤」、
      "データ": {}、
      "子供": []
     }
    ]
   }、
   {{
    "id": "nodePants"、
    「名前」:「パンツ」、
    "データ": {}、
    "子供": [
     {{
      "id": "nodeJeans"、
      "名前": "ジーンズ"、
      "データ": {}、
      "子供": [
       {{
        "id": "nodeBlue"、
        「名前」:「青」、
        "データ": {}、
        "子供": []
       }
      ]
     }、
     {{
      "id": "nodeTrousers"、
      "名前": "ズボン"、
      "データ": {}、
      "子供": [
       {{
        "id": "nodeKhaki"、
        「名前」:「カーキ」、
        "データ": {}、
        "子供": []
       }
      ]
     }
    ]
   }
  ]
 }
]
于 2012-12-05T17:06:32.690 に答える