So, I have a list of dicts in python that looks like this:
lis =
[
{'action': 'Notify', 'type': 'Something', 'Genre': 10, 'date': '2021-05-07 01:59:37'},
{'action': 'Notify', 'type': 'Something Else', 'Genre': 20, 'date': '2021-05-07 01:59:37'}
...
]
Now I want lis
to be in a way, such that each individual dict is ordered using the mapping
for the keys that I will provide. For example, if
mapping = {1:'date', 2:'Genre', 3:'action', 4:'type'}
Then, I want to make my original list of dicts look like this:
lis =
[
{'date': '2021-05-07 01:59:37', 'Genre': 10, 'action': 'Notify', 'type': 'Something'},
{'date': '2021-05-07 01:59:37', 'Genre': 20, 'action': 'Notify', 'type': 'Something Else'}
...
]
How do I implement this?
CodePudding user response:
You might harness collections.OrderedDict
for this task as follows
import collections
order = ['date', 'Genre', 'action', 'type']
dct1 = {'action': 'Notify', 'type': 'Something', 'Genre': 10, 'date': '2021-05-07 01:59:37'}
dct2 = {'action': 'Notify', 'type': 'Something Else', 'Genre': 20, 'date': '2021-05-07 01:59:37'}
odct1 = collections.OrderedDict.fromkeys(order)
odct1.update(dct1)
odct2 = collections.OrderedDict.fromkeys(order)
odct2.update(dct2)
print(odct1)
print(odct2)
output:
OrderedDict([('date', '2021-05-07 01:59:37'), ('Genre', 10), ('action', 'Notify'), ('type', 'Something')])
OrderedDict([('date', '2021-05-07 01:59:37'), ('Genre', 20), ('action', 'Notify'), ('type', 'Something Else')])
Disclaimer: this assume every dict you want to process has exactly all keys from order
. This solution works with any python version which has collections.OrderedDict
if you will be using solely python3.7
or newer you might use common dict
as follows
order = ['date', 'Genre', 'action', 'type']
dct1 = dict.fromkeys(order)
dct1.update({'action': 'Notify', 'type': 'Something', 'Genre': 10, 'date': '2021-05-07 01:59:37'})
print(dct1)
output
{'date': '2021-05-07 01:59:37', 'Genre': 10, 'action': 'Notify', 'type': 'Something'}
Disclaimer still holds
CodePudding user response:
With a list comprehension:
lis = [
{'action': 'Notify', 'type': 'Something', 'Genre': 10, 'date': '2021-05-07 01:59:37'},
{'action': 'Notify', 'type': 'Something Else', 'Genre': 20, 'date': '2021-05-07 01:59:37'}
]
mapping = {1:'date', 2:'Genre', 3:'action', 4:'type'}
sorted_lis = [
{field: record[field] for field in mapping.values()}
for record in lis
]
print(sorted_lis)
CodePudding user response:
Try this:
def sort_dct(li, mapping):
return {v: li[v] for k,v in mapping.items()}
out = []
mapping = {1:'date', 2:'Genre', 3:'action', 4:'type'}
for li in lis:
out.append(sort_dct(li,mapping))
print(out)
Output:
[{'date': '2021-05-07 01:59:37',
'Genre': 10,
'action': 'Notify',
'type': 'Something'},
{'date': '2021-05-07 01:59:37',
'Genre': 20,
'action': 'Notify',
'type': 'Something Else'}]