2016-06-22 20 views
0

Ich möchte die Unterschiede zwischen zwei verschachtelten Wörterbüchern extrahieren und ich möchte, dass das Ergebnis den vollständigen Wörterbuchschlüsselpfad enthält. Ich habe Python 2.7 und DeepDiff installiert, was die beste Option für das zu sein scheint, was ich erreichen möchte. Ich versuche zu bestimmen, wie man die Ausgabe von DeepDiff ändert, so dass es den vollständigen Wörterbuchpfad und die Werte bereitstellt, anstatt eine Menge, die ich nicht indizieren kann. Gibt es eine bessere Möglichkeit, die Ausgabe zu ändern (anstatt die Ausgabe zurück in ein Wörterbuch zu konvertieren)?Finden Sie die Unterschiede zwischen verschachtelten Wörterbüchern, die Listen enthalten

Code:

from __future__ import print_function 
from deepdiff import DeepDiff 
knownAPs = {'WLC1': {'10.1.1.1': {'72.6': ['AP22', 'city'], '55.1': ['AP102', 'office']}}, 'WLC2': {'10.1.1.2': {}}} 
discoveredAPs = {'WLC1': {'10.1.1.1': {}}, 'WLC2': {'10.1.1.2': {}}} 
ddiff = DeepDiff(knownAPs, discoveredAPs) 
if 'dic_item_added' in ddiff.keys(): 
    print('Item added to known: ' + str((ddiff['dic_item_added']))) 
if 'dic_item_removed' in ddiff.keys(): 
    DisAssociatedAPs = (list(list(ddiff['dic_item_removed']))) 
    for i in DisAssociatedAPs: 
     fullkeypath = (str(i).strip('root')) 
     ControllerName = (fullkeypath[0]) 
     ControllerIP = (fullkeypath[1]) 
     AccessPointIndex = (fullkeypath[2]) 
     print('AP: ' + str(knownAPs + fullkeypath) + ' on controller: ' + str(ControllerName) + ' was removed from the known database') 
if 'values_changed' in ddiff.keys(): 
    print('Item changed: ' + str((ddiff['values_changed']))) 

Ausgabe

Traceback (most recent call last): 
    File "C:/xxx/testdic4.py", line 15, in <module> 
    print('AP: ' + str(knownAPs + fullkeypath) + ' on controller: ' + str(ControllerName) + ' was removed from the known database') 
TypeError: unsupported operand type(s) for +: 'dict' and 'str' 

Process finished with exit code 1 

Bevorzugte Ausgangs

AP: ['AP22', 'city'] on controller: ['WLC1'] was removed from the known database 
AP: ['AP102', 'office'] on controller: ['WLC1'] was removed from the known database 
+0

Im Moment haben Sie * keine * Ausgabe, erwartet oder nicht, weil Sie versuchen, ein Diktat und eine Zeichenfolge hinzuzufügen (irgendwo konnte man nicht gestört werden, zu identifizieren). –

+0

Hallo Scott. Aus dem Fehler kann ich sehen, dass ich ein Wörterbuch und eine Zeichenfolge nicht verketten kann. Ich bin ein Anfänger Programmierer und daher, warum ich um Anleitung bitten, wie dies zu tun ist. Gibt es ein anderes Forum, das ich benutzen sollte, um grundlegende Fragen zu stellen? – zeepi

+0

@zeepi Wenn Sie Code schreiben, der einen Fehler verursacht, sollten Sie das Traceback bereitstellen, damit wir leicht sehen können, welche Codezeile den Fehler verursacht hat. –

Antwort

0

Das Problem ist genau das, was die Zurückverfolgungs sagt Ihnen: Sie versuchen, ein Wörterbuch in einen String hinzufügen Das ist natürlich nicht das was du willst. Insbesondere, wenn Sie knownAPs (Typ dict) zu fullkeypath (Typ str) hinzufügen, erhalten Sie einen Fehler, weil dict nicht wissen, wie sich selbst zu einem str hinzufügen.

Aber das beantwortet nicht Ihre allgemeinere Frage, wie man die Diffs auf eine Weise ausgibt, wie Sie wollen. Versuchen Sie diese:

diffs = deepdiff.DeepDiff(knownAPs, discoveredAPs) 

def get_value_from_string(d, s): 
    s = list(filter(None, (piece[2:-1] for piece in s.split(']')))) 

    for piece in s: 
     d = d[piece] 
    return d 


if 'dic_item_removed' in diffs: 
    for item in diffs['dic_item_removed']: 
     item = item.strip('root') 
     base = item[2:item.find(']') - 1] 
     print('AP:', get_value_from_string(knownAPs, item), 
      'on controller: \'' + base + '\' was removed from the known ' 
      'database') 
+0

Verstanden. Also, was ist der beste Weg, um die Fullkeypath Zeichenfolge in einen Dictionary-Schlüssel (z. B. bekannt APs ['WLC1'] ['10.1.1.1'] ['72.6']) zu konvertieren? – zeepi

+0

@zeepi Ich habe meine Antwort aktualisiert, um diese Frage besser beantworten zu können. –

+0

Das ist genau das, was ich wollte :) Vielen Dank, dass Sie sich die Zeit genommen haben, mir zu helfen. Ich werde einige Zeit brauchen, um herauszufinden, wie Sie das gemacht haben. – zeepi

Verwandte Themen