Как вычесть два значения из данных json в python - PullRequest
1 голос
/ 09 июля 2020

У меня есть данные ниже json:

{
    "data": [
        {
            "id": "1",
            "type": "POK",
            "value": "34"
        },
        {
            "id": "1",
            "type": "TOK",
            "value": "32"
        },
        {
            "id": "1",
            "type": "POC",
            "value": "43"
        },
        {
            "id": "2",
            "type": "POK",
            "value": "45"
        },
        {
            "id": "2",
            "type": "TOK",
            "value": "67"
        },
        {
            "id": "3",
            "type": "POK",
            "value": "12"
        },
        {
            "id": "2",
            "type": "POC",
            "value": "23"
        },
        {
            "id": "3",
            "type": "TOK",
            "value": "34"
        },
        
    ]
}

В приведенных выше данных мы видим, что id as 1, 2, 3 с типом POK TOK POC. Мне нужно написать сценарий, чтобы вычесть значение каждого идентификатора, имеющего тип POK и TOK. Например, идентификатор 1 с типом POK вычитается из идентификатора 1 с типом TOK, поэтому 34 - 32, чтобы получить ответ 2. То же самое касается id 2 и 3.

Для этого я подумал сначала извлечь полезные данные сверху json в dicts из list, а затем вычесть каждое значение, как показано ниже:

import json


with open("data.json") as f:
    data = json.load(f)


l = []
for i in range(len(data['data'])):
    d = dict()
    if data['data'][i]['type'] == 'POK':
        d['id'] = data['data'][i]['id']
        d['value'] = data['data'][i]['value']
        d['type'] = 'POK'
        l.append(d)
    if data['data'][i]['type'] == 'TOK':
        d['id'] = data['data'][i]['id']
        d['timestamp'] = data['value'][i]['value']
        d['type'] = 'TOK'
        l.append(d)

Теперь после приведенного выше кода у меня есть список l, в каждом из которых есть 6 dict, который содержит данные

[
{'id': '1', 'value': '34', 'type': 'POK'}, 
{'id': '1', 'value': '32', 'type': 'TOK'}, 
{'id': '2', 'value': '45', 'type': 'POK'}, 
{'id': '2', 'value': '67', 'type': 'TOK'}, 
{'id': '3', 'value': '12', 'type': 'POK'}, 
{'id': '3', 'value': '34', 'type': 'TOK'}
]

После этого я не могу понять, как вычесть значения каждого идентификатора, имеющего тип 'POK' и 'TOK'. Кто-нибудь может дать мне несколько предложений? Есть ли другой способ обработки этого кода?

Ответы [ 3 ]

1 голос
/ 09 июля 2020

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

list_of_dics = [
{'id': '1', 'value': '34', 'type': 'POK'}, 
{'id': '1', 'value': '32', 'type': 'TOK'}, 
{'id': '2', 'value': '45', 'type': 'POK'}, 
{'id': '2', 'value': '67', 'type': 'TOK'}, 
{'id': '3', 'value': '12', 'type': 'POK'}, 
{'id': '3', 'value': '34', 'type': 'TOK'}
]

TOKS = []
POKS = []
for entry in list_of_dics:
  if entry['type'] == 'TOK':
  ## We found a TOK store it for substraction
      TOKS.append((entry['id'], entry['value']))

  if entry['type'] == 'POK':
  ## We found a TOK store it for substraction
      POKS.append((entry['id'], entry['value']))

result = []

#I use this simple for loop since both lists should be of the same size as according to what you've shown on the answer.
for i in range(len(TOKS)):
  if TOKS[i][0] == POKS[i][0]:
  #We make the substractions since they have the same id
    result.append(int(POKS[i][1]) - int(TOKS[i][1]))

print(result)
1 голос
/ 09 июля 2020

Похоже, ваш for l oop ничего не делает, а снова строит тот же объект json. Вместо этого вы можете напрямую перебрать json и выполнить требуемый расчет. Рабочий пример:

import json

with open("data.json") as f:
    data = json.load(f)

result = {}
for d in data['data']:
    id = d['id']
    if d['type'] == 'POK':
        result[id] =  result.get(id, 0) + int(d['value'])
    if d['type'] == 'TOK':
        result[id] = result.get(id, 0) - int(d['value'])

print(result)

Результат:

{'1': 2, '2': -22, '3': -22}
1 голос
/ 09 июля 2020

Вот как можно использовать встроенный метод all():

dct = [{'id': '1', 'value': '34', 'type': 'POK'},
       {'id': '1', 'value': '32', 'type': 'TOK'},
       {'id': '2', 'value': '45', 'type': 'POK'},
       {'id': '2', 'value': '67', 'type': 'TOK'},
       {'id': '3', 'value': '12', 'type': 'POK'},
       {'id': '3', 'value': '34', 'type': 'TOK'}]

for d1 in dct:
    for d2 in dct:
        if all([d1['id'] == d2['id'], d1['type'] == 'POK' ,d2['type'] == 'TOK']):
            dct.append({'id': d1['id'], 'value': str(int(d1['value'])-int(d2['value'])), 'type': 'subtracted'})

print(dct)

Вывод:

[{'id': '1', 'value': '34', 'type': 'POK'},
 {'id': '1', 'value': '32', 'type': 'TOK'},
 {'id': '2', 'value': '45', 'type': 'POK'},
 {'id': '2', 'value': '67', 'type': 'TOK'},
 {'id': '3', 'value': '12', 'type': 'POK'},
 {'id': '3', 'value': '34', 'type': 'TOK'},
 {'id': '1', 'value': '2', 'type': 'subtracted'},
 {'id': '2', 'value': '-22', 'type': 'subtracted'},
 {'id': '3', 'value': '-22', 'type': 'subtracted'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...