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

Asked By: test new jiras

||

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"
        ]
      }
    }
  }
]
Answered By: Pingu
Categories: questions Tags: , , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.