繁体   English   中英

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

[英]Python List Comprehension - extracting from nested data

我是 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 数组的属性,因此导致我的代码失败。

我该如何防范? 用列表理解语法可以更优雅地编写它吗?

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

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

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

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

我以前在 JSON 结构中经常遇到这个问题……经常到几周前我为它写了一个小库……

嵌套密钥检索器 (nkr)

试试发电机,看看它是否能解决你的问题。 你应该能够简单:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM