2017-01-23 2 views
-2

Angenommen, ich habe zwei Objekte in Python (ich werde es einfach halten)beste Weg, um ein Objekt zu schneiden wie ein anderes Objekt zu suchen in Python

A = { "a" : { "b": 3, "c": 2 } } 

B = { "a" : { "b": 7, "c": 4, "d": "howdy" } } 

Wenn ich A als Vorlage für B verwenden möchten, was der beste Weg ist B zu „trimmen“ Objekt, so dass es aussehen wird:

B = { "a" : { "b": 7, "c": 4 } } 

In der Praxis werden die Objekte viel komplexer (einfache Datentypen, sondern auf mehreren Ebenen, Listen, dict, etc.) sein.

edit: unsinnig ‚Obj‘ entfernt Syntax zu beheben

+5

von Objekten tun Sie Wörterbuch gemeint? Ist es garantiert, dass obj B die gleichen Schlüssel wie Obj B hat? Was hast du bisher versucht? – MooingRawr

+2

Ich habe Angst, Ihre Frage nicht zu beantworten, wenn ich mit Ihrem einfachen Beispiel antworte. Das sind keine Objekte, sie sind Wörterbücher und Ihre Deklaration ist nicht korrekt. –

+0

erzeuge 'Obj C' und kopiere Elemente von' Obj B' mit Schlüsseln von 'Obj A' - danach setze' Obj C' anstelle von 'Obj B' – furas

Antwort

0

Sie eine rekursive Funktion für diese verwenden: Prüfen Sie zunächst, ob die Art der Vorlage und das Original gleich sind. Wenn ja, müssen Sie verschiedene Dinge für verschiedene Arten tun. Z. B. könnten Sie für Listen die ursprüngliche Liste auf die Länge der Vorlagenliste reduzieren und bei Wörterbüchern nur die Schlüssel aus der Vorlage beibehalten. Denken Sie in beiden Fällen daran, die Funktion trim rekursiv erneut für die in diesen Listen oder Wörterbüchern enthaltenen Elemente aufzurufen.

def trim(template, original): 
    if type(template) != type(original): 
     raise Exception("Types don't match") 
    if isinstance(template, dict): 
     # iterate keys and apply trim to values from orig dictionary 
     return {k: trim(v, original[k]) for k, v in template.items()} 
    elif isinstance(template, list): 
     # zip lists and apply trim to pairs of templ and orig elements 
     return [trim(t, o) for t, o in zip(template, original)] 
    else: 
     # atom: just return the original value 
     return original 

Beispiel (auch den Wert von "c" auf eine Liste geändert Notiz, die I):

>>> A = { "a" : { "b": 3, "c": [4,5] } } 
>>> B = { "a" : { "b": 7, "c": [8,9,10], "d": "howdy" } } 
>>> trim(A, B) 
{'a': {'b': 7, 'c': [8, 9]}} 
+0

Ok danke. Es ist eigentlich einfacher, weil ich nur "Schlüssel" einschränken muss. Ich könnte darüber nachdenken, in die andere Richtung zu gehen - schwarze Liste statt weiße Liste. Das ist laden meine Vorlage als A = {"a": ["d"]}, um zu signalisieren, dass a.d (wieder, tut mir leid für die Verwendung der richtigen Python-Syntax) ausgeschlossen werden sollte. – rottyguy

+0

@rottyguy Wie sind "einschränkende" Schlüssel einfacher? Wie würden Sie das beispielsweise auf Listen verallgemeinern? –

+0

nicht sicher, ich verstehe Ihre Frage vollständig. Wenn ich nur auf Schlüssel beschränke (in B), könnte meine Vorlage (A) nur die Schlüsselnamen enthalten. Stimmen Sie nicht zu (wenn ja, können Sie ein Beispiel geben?) – rottyguy

Verwandte Themen