2016-08-22 2 views
3

새로운 중첩 된 데이터를 추출하려고했습니다.Python 목록 이해 - 중첩 된 데이터에서 추출

다음은 두 제품에 대한 JSON입니다. 제품이 0 개 이상의 카테고리에 속할 수 있습니다.

{  
    "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']: 

그래서 범주하지 배열을 포함한다는 것입니다 범주 배열이 아닌 범주 속성을 반복하므로 코드가 실패하게됩니다.

어떻게이 문제를 방지 할 수 있습니까? 그리고 이것은 목록 이해 (list comprehension) 구문으로 더 우아하게 작성할 수 있습니까?

답변

4

이 경우 매우 잘못된 문서 구조입니다. 당신은 이것을 처리하면 안됩니다. 항목에 여러 값이 포함될 수있는 경우 항상 목록이어야합니다.

목록에 있는지 여부를 확인하여 코드에서 계속 처리 할 수 ​​있습니다.

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

(당신은 일반적으로 더 설명 변수 이름을 사용하는 것을 고려 할 수 있습니다; x, yz 코드를 읽는 사람들에게 매우 도움이되지 않습니다.)

+0

감사합니다 - 그 치료는 – David

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) 
+1

좋은 될 것입니다. 그것이 상업적 일 때까지. – tuergeist

+0

무료 제품의 광고는 매력적이지만 시간 낭비 일뿐입니다. 나는 전에이 문제를 겪었고, 나는 그것을 스스로 해결했다. 그 코드가 OP에 유용하다면 도움을 준 것을 기쁘게 생각합니다 – Lost

+0

하지만 그 노트에 OP – Lost