- NestedFetch provides syntactic sugar π¬ inspired by XPath to deal with a nested python
dictionary
or a nestedlist
π - You can
get
,set
,update
andflatten
values from a deeply nested dictionary or a list with a more concise, easier and aKeyError
,IndexError
free way π
data = {
"league": "Champions League",
"matches": [
{
"match_id": "match_1",
"goals": [
{
"time": 13,
"scorrer": "Lionel Messi",
"assist": "Luis Suarez"
},
{
"time": 78,
"scorrer": "Luis Suarez",
"assist": "Ivan Rakitic"
}]
},
{
"match_id": "match_2",
"goals": [
{
"time": 36,
"scorrer": "C. Ronaldo",
"assist": "Luka Modric"
}]
}]
}
NestedFetch works with Python3.
You can directly install it via pip
$ pip3 install nestedfetch
Import the methods from the package.
from nestedfetch import nested_get, nested_set, flatten_data
No need to instantiate any object, just use the methods specifying valid parameters.
nested_get(data, keys, default=None, flatten=False)
@Arguments
data : dict / list
keys => List of sequential keys leading to the desired value to fetch
default => Specifies the default value to be returned if any specified key is not present. If not specified, it will be None
flatten => Specifies whether to flatten the returned value
@Return
Returns the fetched value if it exists, or returns specified default value
- Fetch simple nested data :
data = {
'name': 'Jesse Pinkman',
'details': {
'address':{
'city': 'Albuquerque'
}
}
}
res = nested_get(data,['details','address','city'])
# res = Albuquerque
- Fetch simple nested data with
default
value:
data = {
'name': 'Jesse Pinkman',
'details': {
'address':{
'city': 'Albuquerque'
}
}
}
res = nested_get(data,['details','address','state'], default=-1)
# res = -1
- Fetch nested data:
data = {
'name': 'Jesse Pinkman',
'details': {
'address':[{
'city': 'Albuquerque'
},{
'city': 'El Paso'
}]
}
}
res = nested_get(data,['details','address','city'])
# res = ['Albuquerque','El Paso']
- Fetch nested data with
default
value:
data = {
'name': 'Jesse Pinkman',
'details': {
'address':[{
'city': 'Albuquerque'
},{
'city': 'El Paso'
},{
'state': 'New Mexico'
}]
}
}
res = nested_get(data,['details','address','city'], default= None)
# res = ['Albuquerque','El Paso', None]
- Fetch nested data by specifing
index
:
data = {
'name': 'Walter White',
'details': {
'address':[{
'city': 'Albuquerque'
},{
'city': 'El Paso'
}]
}
}
res = nested_get(data,['details','address','city', 0])
# res = Albuquerque
- Fetch nested data without
flatten
:
data = {
"league": "Champions League",
"matches": [
{
"match_id": "match_1",
"goals": [
{
"time": 13,
"scorrer": "Lionel Messi",
"assist": "Luis Suarez"
},
{
"time": 78,
"scorrer": "Luis Suarez",
"assist": "Ivan Rakitic"
}]
},
{
"match_id": "match_2",
"goals": [
{
"time": 36,
"scorrer": "C. Ronaldo",
"assist": "Luka Modric"
}]
}]
}
res = nested_get(data,['matches','goals','scorrer'])
# res = [['Lionel Messi', 'Luis Suarez'], ['C. Ronaldo']]
- Fetch nested data with
flatten
:
data = {
"league": "Champions League",
"matches": [
{
"match_id": "match_1",
"goals": [
{
"time": 13,
"scorrer": "Lionel Messi",
"assist": "Luis Suarez"
},
{
"time": 78,
"scorrer": "Luis Suarez",
"assist": "Ivan Rakitic"
}]
},
{
"match_id": "match_2",
"goals": [
{
"time": 36,
"scorrer": "C. Ronaldo",
"assist": "Luka Modric"
}]
}]
}
res = nested_get(data,['matches','goals','scorrer'], flatten=True)
# res = ['Lionel Messi', 'Luis Suarez', 'C. Ronaldo']
nested_set(data, keys, value, create_missing=False):
@Arguments
data => dict / list
keys => List of sequential keys leading to the desired value to set / update
value => Specifies the value to set / update
create_missing => Specifies whether to create new key while building up if the specified key does not exists
@Return
Returns the number of values updated
- Update value of simple nested data :
data = {
'name': 'Jesse Pinkman',
'details': {
'address':{
'city': 'Albuquerque'
}
}
}
res = nested_set(data,['details','address','city'], "Denver")
# res = 1
# data = {
# 'name': 'Jesse Pinkman',
# 'details': {
# 'address':{
# 'city': 'Denver'
# }
# }
# }
- Update nested data:
data = {
'name': 'Jesse Pinkman',
'details': {
'address':[{
'city': 'Albuquerque'
},{
'city': 'El Paso'
}]
}
}
res = nested_set(data,['details','address','city'], "Denver")
# res = 2
# data = {
# 'name': 'Jesse Pinkman',
# 'details': {
# 'address':[{
# 'city': 'Denver'
# },{
# 'city': 'Denver'
# }]
# }
# }
- Update nested data with
index
:
data = {
'name': 'Jesse Pinkman',
'details': {
'address':[{
'city': 'Albuquerque'
},{
'city': 'El Paso'
}]
}
}
res = nested_set(data,['details','address',0,'city'], "Denver")
# res = 1
# data = {
# 'name': 'Jesse Pinkman',
# 'details': {
# 'address':[{
# 'city': 'Denver'
# },{
# 'city': 'El Paso'
# }]
# }
# }
- Set nested data with
create_missing
:
data = {
'name': 'Jesse Pinkman',
'details': {
'address':{
'city': 'Albuquerque'
}
}
}
res = nested_set(data,['details','address','state'], "New Mexico", create_missing=True)
# res = 1
# data = {
# 'name': 'Jesse Pinkman',
# 'details': {
# 'address':{
# 'city': 'Denver',
# 'state': 'New Mexico'
# }
# }
# }
flatten_data(data):
@Arguments
data => list of list
@Return
Returns the flattened list
- Flatten List of Lists
data = [[
['This','is'],
['flattened', 'data']
]]
res = flatten_data(data)
# res = ['This','is','flattened','data']
Contributions are welcome π.
Feel free to submit a patch, report a bug π or ask for a feature π£.
Please open an issue first to encourage and keep track of potential discussions π.