Найти - Пользователи
Полная версия: Сравнить два json-объекта
Начало » Python для новичков » Сравнить два json-объекта
1
Injector
Доброго всем дня!
Имеются два json-объекта, пусть это будет d1 - url, а d2 - в виде файла. Мне нужно сравнить d1 и d2, сравнив каждое значение из d1 с каждым значением из d2.
 d1 = {"ab":[{"a": "Ivan", "b": 10},{"a": "Ivan", "b": 20},{"a": "Egor", "b": 15},{"a": "Egor", "b": 5},{"a": "Petya", "b": 7},{"a": "Petya", "b": 17},{"a": "Vasya", "b": 8},{"a": "Vasya", "b": 12}]}
d2 = {"cde":[{"c": "Ivan", "d": 5, "e": 15},{"c": "Petya", "d": 15, "e": 18},{"c": "Vasya", "d": 10, "e": 18},{"c": "Egor", "d": 1, "e": 10}]}
for x in d2["cde"]:
    a1 = (d1["ab"][0]["a"])
    c1 = (d2["cde"][0]["c"])
    f1 = float(d1["ab"][0]["b"])
    f2 = float(d2["cde"][0]["d"])
    f3 = float(d2["cde"][0]["e"])
    if a1==c1 and f2 < f1 < f3:
        print(a1, f1)
Выводит:
Ivan 10.0
Ivan 10.0
Ivan 10.0
Ivan 10.0
Понимаю, что делаю-что-то не так, но не могу с этим разобраться(в python новичок). По итогу хочу получить все значения, подходящие под условие if, а именно: Ivan 10.0, Egor 5.0, Petya 17.0, Vasya 12.0. Заранее спасибо за помощь!
ZerG
Давай забудем про то что тут написанно
Итак у нас есть два словаря! Тебе их нужно сравнить! Сравнить по какому параметру? Что должно быть для них результатом?
Injector
Понял, неудачно описал проблему)
Есть два словаря, оба получаю из json-файлов, пример словарей в первом сообщении. Нужно сравнить их по двум условиям:
1. Нужно сравнить на предмет совпадения все значения “а” из словаря d1 со всеми значениями “с” словаря d2.
Например, в словаре d2 есть запись {“c”: “Ivan”, “d”: 5, “e”: 15}.сравнив ее с данными словаря d1, мы видим, что будут подходить два варианта {“a”: “Ivan”, “b”: 10},{“a”: “Ivan”, “b”: 20}.

2.Если “а” и “с” совпадают, то нужно сравнить значения “b” из словаря d1 с значениями “d” и “e” из словаря d2 по формуле: d < b < e
Например: в пункте 1 в словаре d2 значения ключей d и e равны 5 и 15 соответственно. В словаре d1 ключи b равны 10 в первом варианте и 20 во втором. Сравнив их по формуле d < b < e (5 < 10 < 15, 5 < 20 < 15), получаем, что подходит только вариант со значением 10.

И так нужно сравнить весь словарь d1 со всем словарём d2.
Итого, нужно вывести в реультат все значения из словаря d1, которые подходят под эти 2 условия, а именно: Ivan 10, Egor 5, Petya 17, Vasya 12.

Надеюсь, понятно объяснил. Задавайте вопросы, если что-то еще нужно уточнить.
py.user.next
Общий принцип такой: надо постоянно отсекать понемногу от общей массы и потом работать с тем, что осталось.

Общий принцип такой: надо итеративным образом отсекать понемногу от общей массы, оставляя максимум от всего остального, и потом работать с тем, что осталось, повторяя всю эту процедуру снова для оставшейся общей массы. Это процесс декомпозиции.

Это как есть торт: надо отрезать по кусочку, съедать кусочек, потом снова отрезать кусочек и съедать кусочек, и так далее, так ты съешь весь торт; если же ты его будешь сразу заталкивать весь в рот и пытаться проглатывать его весь, то можно и вовсе подавиться этим всем и задохнуться в итоге.

  
>>> d1 = {
...     'ab': [
...         {'a': 'Ivan', 'b': 10},
...         {'a': 'Ivan', 'b': 20},
...         {'a': 'Egor', 'b': 15},
...         {'a': 'Egor', 'b': 5},
...         {'a': 'Petya', 'b': 7},
...         {'a': 'Petya', 'b': 17},
...         {'a': 'Vasya', 'b': 8},
...         {'a': 'Vasya', 'b': 12}
...     ]
... }
>>> 
>>> d2 = {
...     'cde': [
...         {'c': 'Ivan', 'd': 5, 'e': 15},
...         {'c': 'Petya', 'd': 15, 'e': 18},
...         {'c': 'Vasya', 'd': 10, 'e': 18},
...         {'c': 'Egor', 'd': 1, 'e': 10}
...     ]
... }
>>> 
>>> lst1 = d1['ab']
>>> lst2 = d2['cde']
>>> 
>>> tmp = []
>>> for i in lst2:
...     t = [d for d in lst1
...          if d['a'] == i['c']
...          and i['d'] < d['b'] < i['e']]
...     tmp.append(t)
... 
>>> out = []    
>>> for i in tmp:
...     for d in i:
...         out.append((d['a'], d['b']))
... 
>>> out
[('Ivan', 10), ('Petya', 17), ('Vasya', 12), ('Egor', 5)]
>>>
Тут сначала структура словаря отделена от списков, с которыми надо работать. Чтобы с этими списками работать, структура общего словаря не нужна, поэтому отрезаем её и выкидываем. Дальше работаем только со списками словарей.
Затем нам надо выбрать нужные словари из списков, не делая ничего с ними, поэтому сами списки, которые нам не нужны со всеми ненужными словарями в них, мы отрезаем и выкидываем.
И потом, получив нужные словари, мы уже работаем только с ними и начинаем их выводить как-то или выбирать что-то из них.

С каждым шагом остаётся все меньше данных и они становятся всё точнее и определённее.
Injector
py.user.next
Большое Спасибо за развёрнутый ответ. Применил для своих данных, всё выводит как нужно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB