Some coding practice with Json, Itertools and Lambda in Python
I enjoy coding and solving problems. But as I go forward, I find myself in a sea of unknowns. Thus I decided to learn as much as possible to be confident. So, I am learning even the simplest it seems.
Let me start.
I have a json file named data.json having data –
[
{
"name": "Guido Van Rossum",
"city": "Haarlem",
"country": "Netherlands",
"known_for": "Python"
},
{
"name": "Tim Berners-Lee",
"city": "London",
"country": "United Kingdom",
"known_for": "HTML"
},
{
"name": "Brendan Eich",
"city": "Pittsburgh",
"country": "United States of America",
"known_for": "Javascrip"
},
{
"name": "Yukihiro Matsumoto",
"city": "Osaka",
"country": "Japan",
"known_for": "Ruby"
},
{
"name": "James Gosling",
"city": "Calgary",
"country": "Canada",
"known_for": "Java"
},
{
"name": "Linus Torvalds",
"city": "Helsinki",
"country": "Finland",
"known_for": "Linux"
},
{
"name": "Håkon Wium Lie",
"city": "Halden",
"country": "Norway",
"known_for": "C++"
},
{
"name": "Rasmus Lerdorf",
"city": "Qeqertarsuaq",
"country": "Denmark",
"known_for": "php"
},
{
"name": "Dennis Ritchie",
"city": "Bronxville",
"country": "United States of America",
"known_for": "C"
},
{
"name": "Bjarne Stroustrup",
"city": "Aarhus",
"country": "Denmark",
"known_for": "C++"
}
]
How do I read this file in Python?
import json
with open(file="data.json", mode="r") as opened_file:
json_file_object = json.load(opened_file)
print(json_file_object)
This code will just open the file and make the contents as a python dictionary when loaded by json.load().
Now, Let I want to get a dictionary from that list of dictionary with countries as the key and all the persons of a particular country will be in a list of that key. As an example –
{
'United Kingdom': [
{
'name': 'Tim Berners-Lee',
'city': 'London',
'country': 'United Kingdom',
'known_for': 'HTML'
}
],
'United States of America': [
{
'name': 'Brendan Eich',
'city': 'Pittsburgh',
'country': 'United States of America',
'known_for': 'Javascript'
},
{
'name': 'Dennis Ritchie',
'city': 'Bronxville',
'country': 'United States of America',
'known_for': 'C'
}
]
}
How can I do that?
import json
with open(file="data.json", mode="r") as opened_file:
json_file_object = json.load(opened_file)
persons = json_file_object
new_persons = persons.copy()
return_obj_filter = {}
for i, v in enumerate(persons):
commons = list(filter(lambda person: person["country"] == v["country"], new_persons))
if commons:
if return_obj_filter.get(v["country"]):
return_obj_filter[v["country"]] = return_obj_filter[v["country"]].append(commons)
else:
return_obj_filter[v["country"]] = commons
for ii in commons:
indx = new_persons.index(ii)
new_persons.pop(indx)
print(return_obj_filter)
I ran a loop and checked some conditions to make a dictionary. Now it can be done by another way.
import json
from itertools import groupby
with open(file="data.json", mode="r") as opened_file:
json_file_object = json.load(opened_file)
persons = json_file_object
persons.sort(key=lambda x: x["country"])
gob = groupby(persons, key=lambda xx: xx["country"])
return_obj_gob = {}
for k, v in gob:
return_obj_gob[k] = list(v)
print(return_obj_gob)
Here, I have used groupby function from itertools and also little bit lambda to sort and other key.
Obviously It can be done with many ways and can be optimized. I will try to update this post when I again have time working on this.