I have a list of JSON objects, already sorted (by time let’s say). Each JSON object has type
and status
. For example:
JavaScript
x
6
1
[
2
{'type': 'A', 'status': 'ok'},
3
{'type': 'B', 'status': 'ok'},
4
{'type': 'A', 'status': 'fail'}
5
]
6
I’d like to convert it to:
JavaScript
1
5
1
{
2
'A': ['ok', 'fail'],
3
'B': ['ok']
4
}
5
So of course it’s an easy task but I’m looking for the Pythonic way doing that, so it will spare me a few lines of code
Advertisement
Answer
I don’t know if there is a one-liner but you can make use of setdefault
or defaultdict
to achieve the desired result as:
JavaScript
1
6
1
data = [
2
{'type': 'A', 'status': 'ok'},
3
{'type': 'B', 'status': 'ok'},
4
{'type': 'A', 'status': 'fail'}
5
]
6
Using setdefault()
:
JavaScript
1
4
1
res = {}
2
for elt in data:
3
res.setdefault(elt['type'], []).append(elt['status'])
4
Output:
JavaScript
1
2
1
{'A': ['ok', 'fail'], 'B': ['ok']}
2
Using defaultdict
:
JavaScript
1
5
1
from collections import defaultdict
2
res = defaultdict(list)
3
for elt in data:
4
res[elt['type']].append(elt['status'])
5
Output:
JavaScript
1
2
1
defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})
2