将平面数据转换为LIST DICT树

时间:2014-05-21 01:21:37

标签: python tree

对于我的项目,我需要列出所有产品并将其作为我的应用程序的嵌套JSON发送。我已经创建了代码来执行此操作,但我不明白我的逻辑在哪里失败了。以下是我的代码。

我拥有的统一数据类似于typecategorysubnameprice等等。

由于Type,Cat,Sub在一个字符串中,我用re.search解析它们,结果存储在parse

在我的python main中,我检索所有记录,并在for each row in rows中调用:

    product_list = add_on_tree(parse, product_list, p_dict, 1)

其中product_list最初为[],p_dict是一个字典,如:{name:'',price:'',... etc}

def add_on_tree(parse, plist, pdict, i):
    if parse.group(i):
        listCheck = ""
        """
        empty   ==>> plist is empty
        match   ==>> plist[i].type =  parse.group(i)
        nomatch ==>> plist[i].type != parse.group(i)
        """
        if plist==[]:
            listCheck = "empty"
        else:
            listCheck = "nomatch"
            for l in plist:
                if l["type"]==parse.group(i):
                    listCheck = "match"

        if listCheck in ["empty", "nomatch"]:
            newdict = {}
            newdict["type"] = parse.group(i)
            newdict["sub"] = []
            newdict["leaves"] = []
            try:
                if parse.group(i+1):
                    sublist = add_on_tree(parse, [], pdict, i+1 )
                    newdict["sub"] = sublist
                    plist.append(newdict)
                    return plist
            except:
                newdict["leaves"].append(pdict)
                plist.append(newdict)
                return plist
        else:
            for p in plist:
                if p["type"]==parse.group(i):
                    try:
                        if parse.group(i+1):
                            sublist = add_on_tree(parse, p["sub"], pdict, i+1)
                            p["sub"] = sublist
                            return plist
                    except:
                        p["leaves"].append(pdict)
                        return plist
                else:
                    p["sub"] = ["Error Somewhere", p["type"]]
                    return plist

必需的树状结构

 [
   {
     type     : 'car entertainment',
     sub      : [
                  {
                    type     : 'Head Unit',
                    sub      : [
                                 {
                                   type     : 'USB',
                                   sub      : [],
                                   products : [
                                                {
                                                  name : '',
                                                  url  : '',
                                                  price: ''
                                                }
                                              ]
                                 }
                               ],
                    products : []
                  },
                  {},
                  {}
                ],
     products : []
   },
   {
     type     : 'home entertainment',
     sub      : [
                  {
                    type     : 'Audio',
                    sub      : [],
                    products : [
                                 {
                                   name:,
                                   url:,
                                   type:
                                 },
                                 {
                                   name:,
                                   url:,
                                   type:
                                 }
                               ]
                  },
                  {},
                  {}
                ],
     products : []
   }
 ]

我得到了什么:

{
  "products": [
    {
      "leaves": [], 
      "sub": [
        "Error Somewhere", 
        "Car Entertainment"
      ], 
      "type": "Car Entertainment"
    }, 
    {
      "leaves": [], 
      "sub": [
        {
          "leaves": [], 
          "sub": [
            {
              "leaves": [
                {
                  "desc": "", 
                  "image": "", 
                  "name": "", 
                  "price": 25000.0, 
                  "url": ""
                }
              ], 
              "sub": [], 
              "type": "Smartest"
            }
          ], 
          "type": "Smart"
        }
      ], 
      "type": "Home Entertainment"
    }
  ]
}

flask中,我使用了jsonify(products=product_list),它解释了最外面的字典products

其他信息

  1. 我使用的是mysql数据库,它只有四条记录。
  2. 当我使用pdb时,我发现某处出现错误'附加,打印p ["类型"]返回p ['类型']
  3. 如果我改变

    product_list = add_on_tree(parse, product_list, p_dict, 1)
    

    product_list = add_on_tree(parse, [], p_dict, 1)
    

    正确渲染最后一行。这使我认为我的逻辑在列表为空时运行良好,但在必须插入现有结构时失败。

  4. 任何帮助将不胜感激。提前谢谢!

    更新 - 解决方案

    正如@matt指出错误在:

                    else:
                        p["sub"] = ["Error Somewhere", p["type"]]
                        return plist
    

    以下更改消除了错误:

                    else:
                        return plist
    

    PS - 我已经用平面数据取代了嵌套。嵌套(处理)应留给最终应用程序。否则会产生比解决更多的麻烦。

1 个答案:

答案 0 :(得分:1)

你的功能非常复杂,但我认为我看到了眼前的问题:

else:
    p["sub"] = ["Error Somewhere", p["type"]]
    return plist

如果列表中的第一项与您要搜索的类型不匹配,则会出错。相反,如果在没有找到所需类型的情况下遍历列表,则应该出错。

尝试在循环后进行错误检查。