2017-05-17 4 views
-1

Zuordnen von zwei Datenstrukturen bestehend aus Listen und Wörterbüchern. Das Mapping von data sollte rekursiv auf die Struktur payload angewendet werden.Zuordnen von Zeichenfolgen in einer verschachtelten Datenstruktur

Das sind meine Eingaben

data = { 
    'a': 'Apple', 
    'b': 'Ball', 
    'c': 'Cat', 
    'd': 'Dog', 
    'e': 'Egg', 
    'f': 'Fish', 
    'g': 'Goat', 
    'h': 'House', 
    'i': 'Ice-Cream', 
    'j': 'Jaguar', 
    'k': 'Key', 
    'l': 'Lock', 
    'm': 'Map' 
} 

und

payload = { 
    'PI': [ 
     { 
      'one': 'a', 
      'two': 'b', 
      'three': 'c', 
      'four': { 
       'five': 'd', 
       'six': 'e', 
       'seven': 'f', 
       'eight': 'g' 
      } 
     }, { 
      'nine': 'h', 
      'ten': 'i', 
      'eleven': 'j', 
      'twelve': 'k' 
     } 
    ] 
} 

Erwartete Ausgabe:

payload = { 
    'PI': [ 
     { 
      'one': 'Apple', 
      'two': 'Ball', 
      'three': 'Cat', 
      'four': { 
       'five': 'Dog', 
       'six': 'Egg', 
       'seven': 'Fish', 
       'eight': 'Goat' 
      } 
     }, { 
      'nine': 'House', 
      'ten': 'Ice-Cream', 
      'eleven': 'Jaguar', 
      'twelve': 'Key' 
     } 
    ] 
} 

Dies ist mein Versuch, die Zuordnung zu schaffen, aber es nicht

funktioniert

ich diese statt:

{ 
    'PI': [ 
     { 
      'four': { 
       'eight': 'g', 
       'five': 'd', 
       'seven': 'f', 
       'six': 'e' 
      }, 
      'one': 'a', 
      'three': 'c', 
      'two': 'b' 
     }, 
     { 
      'eleven': 'j', 
      'nine': 'h', 
      'ten': 'i', 
      'twelve': 'k' 
     } 
    ] 
} 

Nichts ersetzt.

Antwort

0

Sie können tatsächlich Rekursion verwenden; recurse für Listenwerte und Dictionary-Elemente und nur für alles andere direkt zuordnen. Vergessen Sie nicht, zurückgeben das Ergebnis; die rekursive Funktion erstellt neue Wörterbücher und Listen:

def replace_strings(value, mapping): 
    if isinstance(value, list): 
     return [replace_strings(v, mapping) for v in value] 
    if isinstance(value, dict): 
     return {replace_strings(k, mapping): replace_strings(v, mapping) 
       for k, v in value.items()} 
    return mapping.get(value, value) 

Demo:

>>> pprint(replace_strings(payload, data)) 
{'PI': [{'four': {'eight': 'Goat', 
        'five': 'Dog', 
        'seven': 'Fish', 
        'six': 'Egg'}, 
     'one': 'Apple', 
     'three': 'Cat', 
     'two': 'Ball'}, 
     {'eleven': 'Jaguar', 
     'nine': 'House', 
     'ten': 'Ice-Cream', 
     'twelve': 'Key'}]} 

Ihr Code einige Probleme hatte:

  • Sie den Rückgabewert von jedem rekursiven Aufruf ignoriert.
  • Sie haben die ursprüngliche Eingabe unverändert zurückgegeben.
Verwandte Themen