Python JSON Добавление объекта - PullRequest
2 голосов
/ 16 апреля 2020

Я загрузил два json файла в Python3 .8, и мне нужно объединить два на основе условия.

Obj1 = [{'account': '223', 'colr': '#555555', 'hash': True},
        {'account': '134', 'colr': '#666666', 'hash': True},
        {'account': '252', 'colr': '#777777', 'hash': True}]

Obj2 = [{'sn': 38796, 'code': 'df', 'id': 199, 'desc': 'jex - #777777- gg2349.252'},
        {'sn': 21949, 'code': 'se', 'id': 193, 'desc': 'jex - #555555 - gf23569'},
        {'sn': 21340, 'code': 'se', 'id': 3, 'desc': 'jex - #666666 - gf635387'}]

# What I am trying to get

Obj3 = [{'sn': 38796, 'code': 'df', 'id': 199, 'desc': 'jex - #777777- gg2349.252', 'account': '252', 'colr': '#777777', 'hash': True},
        {'sn': 21949, 'code': 'se', 'id': 193, 'desc': 'jex - #555555 - gf23569', 'account': '223', 'colr': '#555555', 'hash': True},
        {'sn': 21340, 'code': 'se', 'id': 3, 'desc': 'jex - #666666 - gf635387', 'account': '134', 'colr': '#666666', 'hash': True}]

Я попытался из того, что я могу собрать все на SO от append, продлите et c, но я не выполняю условие.

Мне нужно иметь возможность добавлять элементы из Obj1 в Obj2 в их правильном месте на основе условия, что если colr из Obj1 упоминается в desc из Obj2, это должно добавить весь этот элемент из Obj1 в коррелированный элемент Obj2. Или создайте новый Obj3, из которого я могу распечатать эти обновленные значения.

То, что я пробовал и до сих пор смотрел Добавление JSON Объект , Добавление json объекты во вложенный список , Добавление json объекта к существующему json объекту и нескольким другим, которые также не помогли.

Надеюсь, что это имеет смысл, и спасибо

Ответы [ 4 ]

1 голос
/ 16 апреля 2020

Что-то простое, как это будет работать.

for i in range(len(Obj1)):
    for j in range(len(Obj2)):
        if Obj1[i]['colr'] in Obj2[j]['desc']:
            Obj1[i].update(Obj2[j])

print(Obj1)
0 голосов
/ 17 апреля 2020
Obj1 = [{'account': '223', 'colr': '#555555', 'hash': True},
                 {'account': '134', 'colr': '#666666', 'hash': True},
                 {'account': '252', 'colr': '#777777', 'hash': True}]

Obj2 = [{'sn': 38796, 'code': 'df', 'id': 199, 'desc': 'jex - #777777- gg2349.252'},
             {'sn': 21949, 'code': 'se', 'id': 193, 'desc': 'jex - #555555 - gf23569'},
             {'sn': 21340, 'code': 'se', 'id': 3, 'desc': 'jex - #666666 - gf635387'}]

Obj3 = []
for i in  Obj1:
    for j in Obj2:
        if i["colr"]==j["desc"][6:13] :
            a = {**j,**i}
            Obj3.append(a)
print(Obj3)
0 голосов
/ 16 апреля 2020

Вы можете использовать element1['colr'] in element2['desc'], чтобы проверить, совпадают ли элементы из первого и второго массивов. Теперь вы можете перебрать второй массив и для каждого из его элементов найти соответствующий элемент из первого массива, проверив следующее условие:

json_obj3 = []
for element2 in json_obj2:
    for element1 in json_obj1:
        if element1['colr'] in element2['desc']:
            element3 = dict(**element1, **element2)
            json_obj3.append(element3)
            break  # stop inner for loop, because matched element is found

Кстати, это можно записать как одно выражение, используя понимание вложенного списка :

json_obj3 = [
    dict(**element1, **element2)
    for element1 in json_obj1
    for element2 in json_obj2
    if element1['colr'] in element2['desc']
]
0 голосов
/ 16 апреля 2020

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

colr2elem = {elem['colr']: elem for elem in json_obj1}

Тогда вы сможете увидеть, какой цвет добавить, добавляя регулярное выражение к описанию, и обновить словарь json_obj2 (словари слияния).

import re

for elem2 in json_obj2:
    elem1 = colr2elem.get(re.search('#\d+', elem2['desc']).group(0))
    elem2.update(elem1 if elem1 is not None else {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...