2016-08-22 9 views
3

Im neu zu Python und versuchenPython Listenkomprehension - Extrahieren von verschachtelten Daten

einige verschachtelten Daten zu extrahieren

Hier ist die JSON für zwei Produkte. Ein Produkt kann zu null oder mehr Kategorien gehören

{  
    "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" 
} 

Ich möchte herausfinden, zu welchen Kategorien ein Produkt gehört.

zur Extraktion Mein Code ist wie folgt: -

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

Dieses Problem ist in diesem Fall, dass das zweite Element enthält nur eine Kategorie, nicht eine Reihe von Kategorien, so diese Linie

for z in y['Category']: 

Durchläuft die Eigenschaften eines Kategorie- und nicht eines Kategorie-Arrays und bewirkt daher, dass mein Code fehlschlägt.

Wie kann ich davor schützen? Und kann das eleganter mit Listenverständnis Syntax geschrieben werden?

Antwort

4

Das ist eine sehr schlechte Dokumentstruktur in diesem Fall; Du solltest damit nicht fertig werden. Wenn ein Element mehrere Werte enthalten kann, sollte es immer eine Liste sein.

Wie dem auch sei, Sie können immer noch in Ihrem Code damit umgehen, indem Sie überprüfen, ob es eine Liste ist oder nicht.

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

(Sie können im Allgemeinen mit kräftigeren Variablennamen berücksichtigen wollen, x, y und z für Menschen nicht sehr hilfreich sind, den Code zu lesen.)

+0

Danke - das funktionierte ein Leckerbissen – David

1

Ich habe häufig vor in dieser Frage laufen in JSON Strukturen ... häufig genug, dass ich eine kleine Bibliothek für sie vor ein paar Wochen schrieb ...

nested key retriever (nkr)

den Generator Versuchen und sehen, ob es sol Ves dein Problem. Sie sollten in der Lage, einfach zu sein:

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

Ein Beispiel wäre nett. Bis es mehr eine Werbung ist. – tuergeist

+0

Werbung für kostenlose Produkte, obwohl faszinierend, sind wahrscheinlich eine Verschwendung von Zeit und Mühe. Ich hatte dieses Problem schon einmal, ich habe es selbst gelöst. Wenn dieser Code für das OP nützlich ist, bin ich froh, dass ich geholfen habe. – Lost

+0

Aber in diesem Sinne habe ich eine grobe Beispielverwendung für OP hinzugefügt – Lost

Verwandte Themen