Как конвертировать список в Json в Python3 - PullRequest
0 голосов
/ 30 сентября 2018

Я новичок и только начал изучать Python и структуры данных.У меня проблема с преобразованием типов данных, мне нужна ваша помощь, надеюсь, вы можете дать новую идею.

Вопрос в том, чтобы преобразовать строку в json.

Это данные строки:

machine learning,inear model,linear regression,least squares
,neural network,neuron model,activation function
,multi-layer network,perceptron
,,,connection right
,reinforcement learning,model learning,strategy evaluation
,,,strategy improvement
,,model-free learning,monte carlo method
,,,time series learning
,imitate learning,directly imitate learning
,,,inverse reinforcement learning

Тип цели:

{'machine learning':
    [{'inear model':
        [{'linear regression':
            [{'least squares': []}]
          }]},
    {'neural network':
        [{'neuron model':
              [{'activation function': []}]
          }]},
    {'multi-layer network':
         [{'perceptron':
               [{'connection right': []}]
           }]},
    {'reinforcement learning':
         [{'model learning':
               [{'strategy evaluation': []}]
           }]}
    # ··············
     ]
          }

Я успешно заполнил поле, представленное запятой, и получил полный список ниже.

with open('concept.txt', 'r') as f:
    contents = f.readlines()
concepts = []

for concept in contents:
    concept = concept.replace('\n', '')
    array = concept.split(',')
    concepts.append(array)

for i in range(len(concepts)):
    for j in range(len(concepts[i])):
        if concepts[i][j] == '':
            concepts[i][j] = concepts[i-1][j]
print(concepts)


>>> [['machine learning', ' linear model', ' linear regression', ' least squares'], 
    ['machine learning', ' neural network', ' neuron model', ' activation function'],
    ['machine learning', ' multi-layer network', ' perceptron'], 
    ['machine learning', ' multi-layer network', ' perceptron', ' connection right'], 
    ['machine learning', ' reinforcement learning', ' model learning', ' strategy evaluation'], 
    ['machine learning', ' reinforcement learning', ' model learning', ' strategy improvement'], 
    ['machine learning', ' reinforcement learning', ' model-free learning', ' Monte Carlo method'], 
    ['machine learning', ' reinforcement learning', ' model-free learning', 'time series learning'], 
    ['machine learning', ' imitate learning', ' directly imitate learning'], 
    ['machine learning', ' imitate learning', ' directly imitate learning', ' inverse reinforcement learning']] 

Я пытаюсь преобразовать двумерный список в соответствующий многомерный словарь

def dic(list):
    key = list[0]
    list.pop(0)
    if len(list) == 0:
        return {key: []}
    return {key: [dic(list)]}

def muilti_dic(mlist):
    muilti_list = []
    for i in range(len(mlist)):
        dic = dic(mlist[i])
        muilti_list.append(dic)
    return muilti_list

>>> [
     {'machine learning': 
         [{'inear model': 
          [{'linear regression': [{'least squares': []}]}]}]}, 
     {'machine learning': 
        [{'neural network': 
          [{'neuron model': [{'activation function': []}]}]}]}, 
     {'machine learning': 
        [{'multi-layer network': [{'perceptron': []}]}]}, 
     {'machine learning': 
        [{'multi-layer network': 
          [{'perceptron': [{'connection right': []}]}]}]}, 
     {'machine learning': 
        [{'reinforcement learning': 
          [{'model learning': [{'strategy evaluation': []}]}]}]}, 
     {'machine learning': 
        [{'reinforcement learning': 
          [{'model learning': [{'strategy improvement': []}]}]}]}, 
     {'machine learning': 
        [{'reinforcement learning': 
          [{'model-free learning': [{'Monte Carlo method': []}]}]}]}, 
     {'machine learning': 
        [{'reinforcement learning': 
          [{'model-free learning': [{'time series learning': []}]}]}]}, 
     {'machine learning': 
        [{'imitate learning': [{'directly imitate learning': []}]}]}, 
     {'machine learning': [{'imitate learning': [{'directly imitate learning': [{'inverse reinforcement learning': []}]}]}]}
    ]

В настоящее время я застрял в том, как объединить этот многомерный словарь в многомерный словарь.

Как преобразовать текущий список в стиль, требуемый для вопроса?

1 Ответ

0 голосов
/ 01 октября 2018

Вместо создания отдельных словарей и последующего их объединения попробуйте создать окончательный (объединенный) словарь без каких-либо промежуточных шагов.

Фрагмент вашего кода, создающего список concepts, в порядке.

Затем добавьте import json в начале вашей программы и в конце добавьте следующий код:

res = []    # Result
for row in concepts:
    curr = res    # Current object
    for str in row:
        if len(curr) == 0:
            curr.append({})
        curr = curr[0]
        if str not in curr:
            curr[str] = []
        curr = curr[str]

print(json.dumps(res, indent=2))

Как видите, идея такова:

  1. Результатом (res) является список, включающий в себя один объект словаря.
  2. Обработка каждой строки вызывает «спуск по дереву объектов», по каждой строке - элемент текущей строки.
  3. Изначально добавленное значение в словарь (для некоторого ключа) содержит пустой список.Если нет «более встроенного» элемента, это завершает этот «путь».
  4. Перед «спуском по дереву» программа добавляет пустой список в этот список, если он не был добавлен ранее.
  5. Последний шаг - добавление пустого массива под ключом, равным текущей строке.

Результат печати (слегка переформатированный, чтобы занять меньше строк):

[{"machine learning": [{
    "inear model": [{
      "linear regression": [{
        "least squares": []}]}],
    "neural network": [{
      "neuron model": [{
        "activation function": []}]}],
    "multi-layer network": [{
      "perceptron": [{
        "connection right": []}]}],
    "reinforcement learning": [{
      "model learning": [{
        "strategy evaluation": [],
        "strategy improvement": []}],
      "model-free learning": [{
        "monte carlo method": [],
        "time series learning": []}]}],
    "imitate learning": [{
      "directly imitate learning": [{
        "inverse reinforcement learning": []}]}]
    }]
}]
...