2016-07-11 15 views
0

Ich versuche Python zu verwenden, um Unternehmen anhand einer Reihe von Attributen zu klassifizieren. Die Daten zeigen, was jedes Unternehmen Kategorie Attribute hat in einer JSON-Datei, wie gespeichert:Python und JSON bedingte Optimierung

{ 
    "type1": { 
    "business_code": [ 
     1, 
     3, 
     5 
    ], 
    "business_code2": [ 
     2, 
     7, 
     11 
    ], 
    "business_name": [ 
     "pizza", 
     "bagel store" 
    ] 
    }, 
    "type2": { 
    "business_code": [ 
     4, 
     18, 
     23 
    ], 
    "business_code2": [ 
     8, 
     16, 
     72 
    ], 
    "business_name": [ 
     "bank", 
     "credit union" 
    ] 
    } 
} 

Und ich möchte Python verwenden, um sie in einer Funktion zu klassifizieren, die business_code nimmt, business_code2 und business_name als Argumente, wie

with open('json_test.json') as f: 
    j_test = json.load(f) 

def classify_business(business_code, business_code2, business_name): 
    for key, _ in j_test: 
     if (business_code in j_test[key]['business_code'] or 
        business_code2 in j_test[key]['business_code2'] or 
        business_name in j_test[key]['business_name']): 
      break 
     else: 
      continue 
    return key 

das Problem ist, dass ich viele Klassen haben, und die conditionals sind nicht immer gleich für jede Klasse. Zum Beispiel benötigt class1 möglicherweise eine Übereinstimmung für business_code AND (business_code2 oder business_name) und class2 benötigt möglicherweise nur eine Übereinstimmung (business_code ODER business_code2 OR business_name).

Ich würde gerne wissen, ob es eine sauberere Möglichkeit gibt, die Bedingungen in der Python-Funktion zu tun, ohne eine neue explizit für jede Klasse zu schreiben. Vielleicht etwas, das in der JSON-Datei vorzugsweise gemacht werden könnte.

Antwort

0

classify_business sollte eine Funktion ausführen, die testet, ob ein Unternehmen die Kriterien erfüllt.

def classify_business(j_test, tester): 
    for key, business in j_test: 
     if tester(business): 
      return key 
    return None 

Dann können Sie es nennen mit einem lambda

classify_business(j_test, lambda b: return business_code in b['business_code'] or business_code2 in b['business_code2'] or business_name in b['business_name']) 
+0

Ich bin nicht sicher, das ist, was ich suche. Die verschiedenen erforderlichen Bedingungen ändern sich basierend auf den Unternehmensklassen in der JSON-Datei. Wenn Sie also nacheinander die Geschäftstypen durchgehen, um zu prüfen, ob sie zu jedem Geschäft gehören, benötigen Sie für jede Kategorie unterschiedliche Kombinationen von (und) s und (oder) s, aber sie ändern sich nicht auf der Basis auf das Input-Geschäft wird kategorisiert. Entschuldigung, wenn ich nicht klar darüber bin. – jesseWUT

+0

Sie müssen die Frage klären und zeigen, wie Sie dies beabsichtigen. Sie erwähnen Klassen, aber in der Frage gibt es keinen Klassencode. – Barmar

+0

Entschuldigung. Als ich "Klasse" und "Klassifizieren" sagte, meinte ich nur Typ, nichts mit Objekten zu tun. Ich habe die Wörter class und class2 im json-Code in type und type2 geändert. – jesseWUT