2017-02-16 2 views
0

Ich weiß wirklich nicht, wie sonst dieses Problem zu nennen, aber auf meinem aktuellen Projekt habe ich bereits zu viele Workarounds zu vermeiden, so dass ich um Hilfe bitten.Inhalt bewusst Wörterbuch Update

dieser Beispielcode gegeben,

def sensitive_update(sensitive, updated): 
    # ??? 


sensitive_data = {'user1': {'password' : '1234'}, 'user2': {'password': '4321'}} 

updated_data = [ 
    {'user1': {'id': 13}}, 
    {'user2': {'password': '0000'}}, 
    {'user3': {'id': 14}} 
    ] 

for data in updated_data: 
    sensitive_update(sensitive_data, data) 

print(sensitive_data) 
# should print 
# {'user1': {'id': 13, 'password': '1234'}, 'user2': {'password': '0000'}, 'user3': {'id': 14}} 

hat einen meist-builtin existiert oder einen kurzen Weg sensitive_update Funktion des Schreibens, oder manuell durch jeden Wert eines Wörterbuchs Looping rekursiv unvermeidbar?

Edit: Zusätzliche Informationen: Funktion führt alle mergable dicts und erstellt dicts und Schlüssel, die nicht

+0

Ist jedes Element 'updated_data' immer ein Wörterbuch mit einem einzigen Schlüssel? Und was meinst du damit, das Wörterbuch manuell zu durchlaufen? Sie sollten die "aktualisierte_Daten" -Liste durchlaufen ... nein? –

+0

'updated_data' kann mehr als einen Schlüssel haben. Manuelles Schleifen bedeutet, dass man für jeden Schlüssel von "aktualisiert" nach dem passenden Schlüssel in "sensitive" sucht, das gleiche für Werte und ihre Werte macht und so weiter, bis ein Nicht-Diktat gefunden wird. –

+0

updated_data * hat keine Schlüssel *. Es ist eine Liste. Bitte versuchen Sie, genau zu sein, sonst werden die Leute andere Annahmen darüber treffen, was Sie meinen, und es gibt bereits eine nicht zweideutige Terminologie, um dieses Problem zu vermeiden. –

Antwort

2

ich nicht sicher existieren bin, warum Sie manuell über das Wörterbuch laufen würde, aber hier ist die allgemeine Ansatz zu dem, was Sie zu tun versuchen:

In [3]: sensitive_data = {'user1': {'password' : '1234'}, 'user2': {'password': '4321'}} 
    ...: 

In [4]: updated_data = [ 
    ...: {'user1': {'id': 13}}, 
    ...: {'user2': {'password': '0000'}}, 
    ...: {'user3': {'id': 14}} 
    ...: ] 

In [5]: for data in updated_data: 
    ...:  for k,v in data.items(): 
    ...:   sensitive_data.setdefault(k, {}).update(v) 
    ...: 

In [6]: sensitive_data 
Out[6]: 
{'user1': {'id': 13, 'password': '1234'}, 
'user2': {'password': '0000'}, 
'user3': {'id': 14}} 

Sie können die Leistung gewinnen, indem sie ein defaultdict zu statt eine Ebene dict mit der setdefault Methode. Im Wesentlichen ist es ein Wörterbuch mit optimiertem die setdefault Methode zu tun, aber es funktioniert mit normalen Schlüssel-Zugang:

In [11]: sensitive_data = {'user1': {'password' : '1234'}, 'user2': {'password': '4321'}} 
    ...: 
    ...: 

In [12]: from collections import defaultdict 
In [13]: d = defaultdict(dict) 

In [14]: d.update(sensitive_data) # convert plain dict to defaultdict 

In [15]: d 
Out[15]: 
defaultdict(dict, 
      {'user1': {'password': '1234'}, 'user2': {'password': '4321'}}) 

In [16]: for data in updated_data: 
    ...:  for k,v in data.items(): 
    ...:   d[k].update(v) 
    ...: 

In [17]: d 
Out[17]: 
defaultdict(dict, 
      {'user1': {'id': 13, 'password': '1234'}, 
      'user2': {'password': '0000'}, 
      'user3': {'id': 14}}) 
+0

Gosh, wie könnte ich diejenigen vermissen? Vielen Dank, genau das habe ich gesucht! –

0

Sie können Update Wörterbuch der Verwendung Methode:

for data in updated_data: 
    for k, v in data.items(): 
     if k in sensitive_data:   
      sensitive_data[k].update(v) # update the information of the corresponding user 
     else: 
      sensitive_data[k] = v 

sensitive_data 
# {'user1': {'id': 13, 'password': '1234'}, 
# 'user2': {'password': '0000'}, 
# 'user3': {'id': 14}}