want to genertate complex desired list of object using list and python
Question:
I want to generate data based on some rules and on in the unique structure
can’t know how to do it,
any help would be appreciated it
i have two list:
categories = [
'fruits' 'meats'
]
and another list is :
only_on2 = [
{
"earth": [
{
"code": 1,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 2,
"cats_name": 'meats',
"name": "beef"
},
{
"code": 7,
"cats_name": 'meats',
"name": "chicken"
}
],
"sky": [
{
"code": 3,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 4,
"cats_name": 'meats',
"name": "chicken"
}
]
}
]
and want to generate this new list based on previous lists
result_desired = [
{
"name_place": "earth",
"data": {
"fruits": {"UNIT #": [1],
"Name": ["apple"]
},
"meats": {"UNIT #": [2, 7],
"Name": ["beef", "chicken"]
},
}
},
{
"name_place": "sky",
"data": {
"fruits": {"UNIT #": [3],
"Name": ["apple"]
},
"meats": {"UNIT #": [4],
"Name": ['chicken']
},
}
}
]
what i tried ,
those way not working because need to but two list inside list comaprison
results = {place: {cat: {
'UNIT #': [item1 for key, value in only_on2 if item1['cats_name'] == cat for item1 in value],
} for cat in categories} for place in only_on2}
any help would be appreciate it
Answers:
This is a little more complex than you may have imagined to process reliably.
How about:
import json # only needed for output formatting
categories = [
'fruits',
'meats'
]
only_on2 = [
{
"earth": [
{
"code": 1,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 2,
"cats_name": 'meats',
"name": "beef"
},
{
"code": 7,
"cats_name": 'meats',
"name": "chicken"
}
],
"sky": [
{
"code": 3,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 4,
"cats_name": 'meats',
"name": "chicken"
}
]
}
]
result_desired = []
for d in only_on2:
for k, v in d.items():
data = {}
_d = {'name_place': k, 'data': data}
for _v in v:
if (cn := _v.get('cats_name')) in categories:
data.setdefault(cn, {}).setdefault('UNIT #', []).append(_v.get('code'))
data[cn].setdefault('Name', []).append(_v.get('name'))
result_desired.append(_d)
print(json.dumps(result_desired, indent=2))
Output:
[
{
"name_place": "earth",
"data": {
"fruits": {
"UNIT #": [
1
],
"Name": [
"apple"
]
},
"meats": {
"UNIT #": [
2,
7
],
"Name": [
"beef",
"chicken"
]
}
}
},
{
"name_place": "sky",
"data": {
"fruits": {
"UNIT #": [
3
],
"Name": [
"apple"
]
},
"meats": {
"UNIT #": [
4
],
"Name": [
"chicken"
]
}
}
}
]
I want to generate data based on some rules and on in the unique structure
can’t know how to do it,
any help would be appreciated it
i have two list:
categories = [
'fruits' 'meats'
]
and another list is :
only_on2 = [
{
"earth": [
{
"code": 1,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 2,
"cats_name": 'meats',
"name": "beef"
},
{
"code": 7,
"cats_name": 'meats',
"name": "chicken"
}
],
"sky": [
{
"code": 3,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 4,
"cats_name": 'meats',
"name": "chicken"
}
]
}
]
and want to generate this new list based on previous lists
result_desired = [
{
"name_place": "earth",
"data": {
"fruits": {"UNIT #": [1],
"Name": ["apple"]
},
"meats": {"UNIT #": [2, 7],
"Name": ["beef", "chicken"]
},
}
},
{
"name_place": "sky",
"data": {
"fruits": {"UNIT #": [3],
"Name": ["apple"]
},
"meats": {"UNIT #": [4],
"Name": ['chicken']
},
}
}
]
what i tried ,
those way not working because need to but two list inside list comaprison
results = {place: {cat: {
'UNIT #': [item1 for key, value in only_on2 if item1['cats_name'] == cat for item1 in value],
} for cat in categories} for place in only_on2}
any help would be appreciate it
This is a little more complex than you may have imagined to process reliably.
How about:
import json # only needed for output formatting
categories = [
'fruits',
'meats'
]
only_on2 = [
{
"earth": [
{
"code": 1,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 2,
"cats_name": 'meats',
"name": "beef"
},
{
"code": 7,
"cats_name": 'meats',
"name": "chicken"
}
],
"sky": [
{
"code": 3,
"cats_name": 'fruits',
"name": "apple"
},
{
"code": 4,
"cats_name": 'meats',
"name": "chicken"
}
]
}
]
result_desired = []
for d in only_on2:
for k, v in d.items():
data = {}
_d = {'name_place': k, 'data': data}
for _v in v:
if (cn := _v.get('cats_name')) in categories:
data.setdefault(cn, {}).setdefault('UNIT #', []).append(_v.get('code'))
data[cn].setdefault('Name', []).append(_v.get('name'))
result_desired.append(_d)
print(json.dumps(result_desired, indent=2))
Output:
[
{
"name_place": "earth",
"data": {
"fruits": {
"UNIT #": [
1
],
"Name": [
"apple"
]
},
"meats": {
"UNIT #": [
2,
7
],
"Name": [
"beef",
"chicken"
]
}
}
},
{
"name_place": "sky",
"data": {
"fruits": {
"UNIT #": [
3
],
"Name": [
"apple"
]
},
"meats": {
"UNIT #": [
4
],
"Name": [
"chicken"
]
}
}
}
]