Python Список для вложенных Json - PullRequest
0 голосов
/ 25 января 2020

У меня следующая проблема.

class Inventory:
    def __init__(self,project_no,country,category,product,count):
        self.project_no = project_no
        self.country = country
        self.category = category
        self.product = product
        self.count = count
inventory_list = []
inventory_list.append(Inventory(1,'USA','Beverages','Milk',2))
inventory_list.append(Inventory(1,'USA','Beverages','Juice',5))
inventory_list.append(Inventory(1,'USA','Snacks','Potato Chips',2))
inventory_list.append(Inventory(1,'USA','Oils','Canola',5))
inventory_list.append(Inventory(1,'USA','Oils','Olive',8))
inventory_list.append(Inventory(1,'CAN','Beverages','Milk',7))
inventory_list.append(Inventory(1,'CAN','Beverages','Juice',8))
inventory_list.append(Inventory(1,'CAN','Snacks','Potato Chips',8))
inventory_list.append(Inventory(1,'CAN','Oils','Canola',3))
inventory_list.append(Inventory(1,'CAN','Oils','Olive',4))

{'Inventory': [{'Country': inv.country , 'Category' : [{inv.category : [{'Product' : inv.product}]}] }  for inv in inventory_list]}

Этот код дает мне следующий вывод.

{'Inventory': [{'Country': 'USA',
   'Category': [{'Beverages': [{'Product': 'Milk'}]}]},
  {'Country': 'USA', 'Category': [{'Beverages': [{'Product': 'Juice'}]}]},
  {'Country': 'USA', 'Category': [{'Snacks': [{'Product': 'Potato Chips'}]}]},
  {'Country': 'USA', 'Category': [{'Oils': [{'Product': 'Canola'}]}]},
  {'Country': 'USA', 'Category': [{'Oils': [{'Product': 'Olive'}]}]},
  {'Country': 'CAN', 'Category': [{'Beverages': [{'Product': 'Milk'}]}]},
  {'Country': 'CAN', 'Category': [{'Beverages': [{'Product': 'Juice'}]}]},
  {'Country': 'CAN', 'Category': [{'Snacks': [{'Product': 'Potato Chips'}]}]},
  {'Country': 'CAN', 'Category': [{'Oils': [{'Product': 'Canola'}]}]},
  {'Country': 'CAN', 'Category': [{'Oils': [{'Product': 'Olive'}]}]}]}

То, что мне действительно нужно, больше похоже на ниже.

{
  "Inventory": [{
          "country": "USA",
          "category": [{
              "Beverages": [{
                  "product": "Milk",
                  "count": 2
              }, {
                  "product": "Juice",
                  "count": 5
              }]
          }, {
              "Snacks": [{
                  "product": "Potato Chips",
                  "count": 2
              }]
          }, {
              "Oils": [{
                  "product": "Canola",
                  "count": 5
              }, {
                  "product": "Olive",
                  "count": 8
              }]
          }]

      }, {
          "country": "CAN",
          "category": [{
              "Beverages": [{
                  "product": "Milk",
                  "count": 7
              }, {
                  "product": "Juice",
                  "count": 8
              }]
          }, {
              "Snacks": [{
                  "product": "Potato Chips",
                  "count": 8
              }]
          }, {
              "Oils": [{
                  "product": "Canola",
                  "count": 3
              }, {
                  "product": "Olive",
                  "count": 4
              }]
          }]
      }

  ]
}

Как это сделать? Я думал, что понимание списка - это путь к go. Но у меня проблемы за пределами этой точки. Я думал, что это должно быть действительно легко для python кодера. С моим ограниченным python я мог достичь только этого. Если кто-нибудь может помочь.

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Я бы посоветовал вам попробовать сериализовать свой класс Inventory , используя модуль json. Однако, похоже, вы захотите немного реорганизовать свои данные. Из того, что я могу сказать, вы хотите иметь инвентарь , который имеет коллекцию стран , которые содержат набор из продуктов , разделенных на категории .

Сначала давайте определим класс Product :

class Product(object):
    def __init__(self, name, count):
        self.product = name
        self.count = count

Затем мы можем определить класс Country в качестве контейнера для установите Продукты , расположенные в словаре, используя категорию в качестве ключа.

class Country(object):
    def __init__(self, name):
        self.name = name
        self.categories = dict()

    def add_product_to_category(self, category, product):
        if category not in self.categories:
            self.categories[category] = []
        self.categories[category].append(product)

Затем мы можем переопределить Инвентарь class как контейнер для набора Country объектов.

class Inventory(object):
    def __init__(self, project_no):
        self.project_no = project_no
        self.countries = []

Далее, мы можем использовать простые методы для заполнения наших классов необходимыми данными.

inv = Inventory(1)

us_set = Country('USA')
us_set.add_product_to_category('Beverages', Product('Milk', 2))
us_set.add_product_to_category('Beverages', Product('Juice', 5))
us_set.add_product_to_category('Snacks', Product('Potato Chips', 2))
us_set.add_product_to_category('Oils', Product('Canola', 5))
us_set.add_product_to_category('Oils', Product('Olive', 8))

canada_set = Country('CAN')
canada_set.add_product_to_category('Beverages', Product('Milk', 7))
canada_set.add_product_to_category('Beverages', Product('Juice', 8))
canada_set.add_product_to_category('Snacks', Product('Potato Chips', 8))
canada_set.add_product_to_category('Oils', Product('Canola', 3))
canada_set.add_product_to_category('Oils', Product('Olive', 4))

inv.countries.append(us_set)
inv.countries.append(canada_set)

Наконец, (чтобы ответить на ваш вопрос, lul), чтобы сериализовать класс Inventory , мы должны определить кодировщик для использования:

class MyEncoder(json.JSONEncoder):
    def default(self, o):
        return o.__dict__

Теперь мы можем просто вызвать json .dumps (), чтобы получить строковый вывод нашего сериализованного инвентаря .

json.dumps(inv, indent=2, cls=MyEncoder)

Вывод не точно * 105 0 * что вы изложили, но я думаю, что этот метод будет хорошо работать для вас.

{
  "project_no": 1, 
  "countries": [
    {
      "name": "USA", 
      "categories": {
        "Beverages": [
          {
            "count": 2, 
            "product": "Milk"
          }, 
          {
            "count": 5, 
            "product": "Juice"
          }
        ], 
        "Oils": [
          {
            "count": 5, 
            "product": "Canola"
          }, 
          {
            "count": 8, 
            "product": "Olive"
          }
        ], 
        "Snacks": [
          {
            "count": 2, 
            "product": "Potato Chips"
          }
        ]
      }
    }, 
    {
      "name": "CAN", 
      "categories": {
        "Beverages": [
          {
            "count": 7, 
            "product": "Milk"
          }, 
          {
            "count": 8, 
            "product": "Juice"
          }
        ], 
        "Oils": [
          {
            "count": 3, 
            "product": "Canola"
          }, 
          {
            "count": 4, 
            "product": "Olive"
          }
        ], 
        "Snacks": [
          {
            "count": 8, 
            "product": "Potato Chips"
          }
        ]
      }
    }
  ]
}
0 голосов
/ 25 января 2020

попробуйте использовать модуль json, например,

import json
...
inv_json = {'Inventory': [{'Country': inv.country , 'Category' : [{inv.category : [{'Product' : inv.product}]}] }  for inv in inventory_list]}
json_formatted_str = json.dumps(x, indent=2)
print(json_formatted_str)

https://www.journaldev.com/33302/python-pretty-print-json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...