Home > Back-end >  python according to the same value combining dictionary
python according to the same value combining dictionary

Time:07-12

i have a list of dict like this

[
{'id': 'A123',
  'feature': {'name': 'jack', 'age' : '18' },
  'create_time': '2022-5-17 10:29:47',
  'is_fast': False},
  
 {'id': 'A123',
  'feature': {'gender': 'male'},
  'create_time': '2022-5-17 10:29:47',
  'is_fast': False},
  
{'id': 'A123',
  'habit': {'name': 'read'},
  'create_time': '2022-5-15 10:29:45',
  'is_fast': False},

{'id': 'A456',
  'feature': {'name': 'rose'},
  'create_time': '2022-4-15 10:29:45',
  'is_fast': False},
  
  {'id': 'A456',
  'habit': {'name': 'sport'},
  'create_time': '2022-3-15 10:29:45',
  'is_fast': False}
]

But I want to merge the same "id" values ​​together using something function

The desired output is as follows

[

{'id': 'A123',
  'feature': {'name': 'jack', 'age' : '18' ,'gender': 'male'},
  'habit': {'name': 'read'},
  'create_time': '2022-5-19 10:29:47',  #Get the latest time based on the same id
  'is_fast': False},

{'id': 'A456',
  'feature': {'name': 'rose'},
  'habit': {'name': 'sport'},
  'create_time': '2022-4-15 10:29:45',
  'is_fast': False},
  
]

How can I merge the same "id" values ​​according to these dictionaries..

CodePudding user response:

This should get you started... I put some inline notes to explain what the code is doing. You still need to implement a date time comparison.

def merge_dicts(lst):
    final = {}    #  results
    for row in lst:   # iterate through list
        if row['id'] not in final:   # if current item id hasnt been seen
            final[row['id']] = row   # assign it to results with id as the key
        else:
            record = final[row['id']]  # otherwise compare to data already stored
            for k,v in row.items():   #iterate through dictionary items
                if k not in record:   # if key not in results
                    record[k] = v     # add the key and value
                    continue
                if record[k] == v: continue  # if they are already equal move on
                if isinstance(v, dict):    # if its a dictionary
                    record[k].update(v)    # update the dictionary
                else:  # must be date time sequence so do some datetime comparison
                    """Do some date comparison and assign correct date"""
    return [v for k,v in final.items()]  # convert to list 


print(merge_dicts(lst))

output:

[
  {
    'id': 'A123', 
    'feature': {'name': 'jack', 'age': '18', 'gender': 'male'}, 
    'create_time': '2022-5-17 10:29:47', 
    'is_fast': False, 
    'habit': {'name': 'read'}
  }, 
  {
    'id': 'A456', 
    'feature': {'name': 'rose'}, 
    'create_time': '2022-4-15 10:29:45', 
    'is_fast': False, 
    'habit': {'name': 'sport'}
  }
]
  • Related