Форум сайта python.su
Доброго всем дня!
Имеются два 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)
Офлайн
Давай забудем про то что тут написанно
Итак у нас есть два словаря! Тебе их нужно сравнить! Сравнить по какому параметру? Что должно быть для них результатом?
Офлайн
Понял, неудачно описал проблему)
Есть два словаря, оба получаю из 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.
Надеюсь, понятно объяснил. Задавайте вопросы, если что-то еще нужно уточнить.
Отредактировано Injector (Окт. 30, 2022 17:53:09)
Офлайн
Общий принцип такой: надо постоянно отсекать понемногу от общей массы и потом работать с тем, что осталось.
Общий принцип такой: надо итеративным образом отсекать понемногу от общей массы, оставляя максимум от всего остального, и потом работать с тем, что осталось, повторяя всю эту процедуру снова для оставшейся общей массы. Это процесс декомпозиции.
Это как есть торт: надо отрезать по кусочку, съедать кусочек, потом снова отрезать кусочек и съедать кусочек, и так далее, так ты съешь весь торт; если же ты его будешь сразу заталкивать весь в рот и пытаться проглатывать его весь, то можно и вовсе подавиться этим всем и задохнуться в итоге.
>>> 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)] >>>
Отредактировано py.user.next (Окт. 30, 2022 21:54:00)
Офлайн
py.user.next
Большое Спасибо за развёрнутый ответ. Применил для своих данных, всё выводит как нужно.
Офлайн