2017-11-19 3 views
0

ich zur Zeit dieser durch JSON als schnelles Beispiel Parsen ist, wie es aussieht:Wie kann ich den Wert eines Wörterbuchs mit einem anderen vergleichen und diesen Wert erhalten?

Wörterbuch 1:

data: 
    0: 
     tag "importanttagone" 
     value 233 
    1: 
     tag "importanttagtwo" 
     value 234 

Wörterbuch 2:

data: 
    0: 
     name "Important Tag One" 
     tag  "importanttagone" 
    1: 
     name "Important Tag Two" 
     tag  "importanttagtwo" 

Also im Wesentlichen, was ich will, ist um den Namen und den zugehörigen Wert anzuzeigen.

Expected Output: 

Name: Important Tag On 

Value: 233 

Gibt es eine Möglichkeit, beide Tags in den Wörterbüchern zu vergleichen und dann den Namen bekommen, der als Tag in der gleichen Tonart ist?

+0

Könnten Sie Ausgang liefern erwartet? – Alexey

+0

@Alexey Entschuldigung. Ich habe es –

Antwort

0

Wenn die gleichen Tags hat die gleichen Schlüssel in den dicts:

[(d1[key]['name'], d2[key]['value']) for key in d1 if key in d2] 
0

vergleichen die beiden Wörterbücher vielleicht elementweise durch Iteration durch beide dicts:

for k1 in dict1: 
    for k2 in dict2: 
     if dict1[k1]['tag'] == dict2[k2]['tag'] 
     print('Name : ' + dict[k1]['name']) 
     print('Value : ' + dict[k2]['value']) 
+0

Danke, aber ich habe das schon versucht, und ich bekomme immer: ‚ KeyError:‚Tag‘‘ [data ‚] zu den ersten beiden Zeilen –

+0

Ich habe‘. für k1 in dict1 [ 'data']: für k2 in dict2 [ 'data']: aber jetzt erhalte ich: Typeerror: unhashable Typen: 'dict' –

+1

ich Ihren Wörterbuch nicht zu 100% sicher bin, Struktur. ist es wie der von @Alexey erklärte? Du hast 2 Diktate, dict1 und dict2 mit den gleichen Tags? jemals darüber nachgedacht, es in ein und dasselbe Diktat zu stecken, da du nur deine notwendige Erinnerung verdoppelst? – Dorian

1
d1 = { 
    "data":{ 
     0: { 
      "tag": "importanttagone", 
      "value": 233 
     }, 
     1: { 
      "tag": "importanttagtwo", 
      "value": 234 
     } 
    } 
} 

d2 = { 
    "data":{ 
     0: { 
      "tag": "importanttagone", 
      "name": "Important Tag One" 
     }, 
     1: { 
      "tag": "importanttagtwo", 
      "name": "Important Tag Two" 
     } 
    } 
} 

d1_flat = {v['tag']: v['value'] for _, v in d1['data'].items()} 
d2_flat = {v['tag']: v['name'] for _, v in d2['data'].items()} 

result = {} 

for k, v in d1_flat.items(): 
    name = d2_flat.get(k, None) 
    if name: 
     result[name] = v 

print(result) 

Ausgang:

{'Important Tag One': 233, 'Important Tag Two': 234} 
+0

Ich erhalte ein: Typeerror : Listenindizes müssen ganze Zahlen oder Slices sein, nicht str –

+0

'get' gibt Ihnen' None' kostenlos. Keine Notwendigkeit, es als zweites Argument zu schreiben. –

+1

Wenn Sie die dict keys nicht verwenden, können Sie einfach 'for v in d1 ['data']. Values ​​()' verwenden. Ansonsten ist Ihre Lösung effizienter als die anderen. –

0

You can try One line solution :

#data from @Alexey 

d1 = { 
    "data":{ 
     0: { 
      "tag": "importanttagone", 
      "value": 233 
     }, 
     1: { 
      "tag": "importanttagtwo", 
      "value": 234 
     } 
    } 
} 

d2 = { 
    "data":{ 
     0: { 
      "tag": "importanttagone", 
      "name": "Important Tag One" 
     }, 
     1: { 
      "tag": "importanttagtwo", 
      "name": "Important Tag Two" 
     } 
    } 
} 

print({item.get('value'):sub_item.get('name') for item in d1['data'].values()for sub_item in d2['data'].values()if item.get('tag') in sub_item.values()}) 

output:

{233: 'Important Tag One', 234: 'Important Tag Two'} 
Verwandte Themen