简体   繁体   中英

How to update values in a nested dictionary using values from another nested dictionary

New to the Stackoverflow, apologies if the title isn't that clear.

Effectively I am working with two xl to CSV files, both converted into nested dictionaries using method to_dict , where index is the key for the each (main?) dictionary and the columns are the keys for each nested dictionary.

ie

 DICTA = {0: {x:1, y:2, v:3}, 1: {x:5, y:6, v:7}, 2: {x:8, y:9, v:10}}

 DICTB = {0: {a:3, b:12, c:13, d:14}, 1: {a:15, b:16, c:17, d:18}, 2: {a:19, b:20, c:21, d:22}}

Values are arbitrary for the example above (length of both dictionaries will always be the same, nested dictionaries have different number of keys)

Each nested dictionary in DICT B can only be used once to update aa nested DICT A dict ie each nested dict in DICT A 'belongs' to a nested dict in DICT B but not in any specific order.

My aim is to update values (of nested dicts) in Dict A with values from Dict B (keys are diff for both) if other conditions/values are met.. ie what I have so far:

for k, v in DICTA.items():
i=0
h=0
  if DICTA[i].get('v') in (DICTB[h].get('a'), (DICTB[h].get('b')):
    if (DICTB[h].get('a') != '15': #another condition I need to put in
        DICTA[i].update({'x': DICTB[h].get('c')}) 
        DICTA[i].update({'y': DICTB[h].get('d')})
        i+=1 
    else:
        DICTA[i].update({'y': DICTB[h].get('c')}) 
        DICTA[i].update({'x': DICTB[h].get('d')})
        i+=1
  else:
      h+=1

Actual output:

In: DICTA

Out: {0: {x:13, y:14, v:3}, 1: {x:5, y:6, v:7}, 2: {x:8, y:9, v:10}}

Expected Output for the above:

In: DICTA

Out: {0: {x:13, y:14, v:3}, 1: {x:18, y:17, v:7}, 2: {x:21, y:22, v:10}}

My issue is that this works for the first DICTA entry but then fails to update the next two ie this clearly doesn't update i or h correctly to loop through the next nested dictionary.

Fully aware the above might be painfully un-pythonic and am very much open to easier ways of solving this.

Thanks guys appreciate any help with the above.

If I understand you correctly this should work:

for row_a, row_b in zip(DICTA.values(), DICTB.values()):
    if row_a.get('v') in (row_b.get('a'), row_b.get('b')):
        if row_b.get('a') != '15':
            row_a.update({
                'x': row_b.get('c'), 
                'y': row_b.get('d')
            })
        else:
            row_a.update({
                'y': row_b.get('c'), 
                'x': row_b.get('d')
            })

Also instead of:

row_a.update({
    'x': row_b.get('c'), 
    'y': row_b.get('d')
})

You could use:

row_a['x'] = row_b.get('c')
row_a['y'] = row_b.get('d')

but that's a question of preference.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM