Python List Comprehension - 从嵌套数据中提取

时间:2016-08-22 12:07:02

标签: python

我是python的新手并试图提取出一些嵌套数据

这是两个产品的JSON。产品可以属于零个或多个类别

 {  
   "Item":[  
      {   
         "ID":"170",
         "InventoryID":"170",
         "Categories":[  
            {  
               "Category":[  
                  {  
                    "CategoryID":"444",
                    "Priority":"0",
                    "CategoryName":"Paper Mache"
                  },
                  {  
                     "CategoryID":"479",
                     "Priority":"0",
                     "CategoryName":"Paper Mache"
                  },
                  {  
                     "CategoryID":"515",
                     "Priority":"0",
                     "CategoryName":"Paper Mache"
                  }
               ]
            }
         ],
         "Description":"Approximately 9cm wide x 4cm deep.",
         "SKU":"111931"
      },
      {  
         "ID":"174",
         "InventoryID":"174",
     "    Categories":[  
            {  
                "Category":{  
                  "CategoryID":"888",
                  "Priority":"0",
                  "CategoryName":"Plaster"
                }
            }
         ],
         "Description":"Plaster Mould - Australian Animals",
         "SKU":"110546"
      }
   ],
   "CurrentTime":"2016-08-22 11:52:27",
   "Ack":"Success"
}

我想弄清楚产品属于哪个类别。

我的提取代码如下: -

        for x in products: 
            productsInCategory = []
            for y in x['Categories']:
                for z in y['Category']:
                    if z['CategoryID'] == categories[i]['CategoryID']:
                        productsInCategory.append(x)

这个问题是,在这种情况下,第二项只包含一个类别,而不是一个类别数组,所以这一行

for z in y['Category']:

遍历Category的属性而不是Category数组,因此导致我的代码失败

我该如何防范这种情况?使用列表推导语法可以更优雅地编写它吗?

2 个答案:

答案 0 :(得分:4)

在这种情况下,这是一个非常糟糕的文件结构;你不应该处理这件事。如果项目可以包含多个值,则它应始终为列表。

尽管如此,您仍然可以通过检查它是否是列表来处理代码。

for x in products: 
    productsInCategory = []
    for y in x['Categories']:
        category = y['Category']
        if isinstance(category, dict):
            category = [category]
        for z in category:
            ...

(您可能需要考虑一般使用更具描述性的变量名称; xyz对阅读代码的人不是很有帮助。)

答案 1 :(得分:1)

我在JSON结构之前经常遇到这个问题...经常我几周前为它写了一个小型库...

nested key retriever (nkr)

尝试生成器并查看它是否解决了您的问题。你应该能够简单:

for x in products: 
    if product_id_searching_for in list(nkr.find_nested_key_values(x, 'CategoryID')):
         productsInCategory.append(x)