Я пытаюсь просмотреть все элементы двух данных словарей, чтобы убедиться, что они равны, и если нет, я хочу назвать свойство, в котором они различаются.
Вот мой основной подход:
# Dictionnaries
v1 = { "a" : { "b" : 1, "c" : 2 }, "d" : { "e" : { "f" : 3 }}}
v2 = { "a" : { "b" : 1, "c" : 2 }, "d" : { "e" : { "f" : 4 }}}
def gen(k, v):
if type(v) is dict:
for k in v:
yield from gen(k, v[k])
else:
yield k, v
# Used alone the generator works as expected:
for k, v in gen("root", v1):
print("{}: {}".format(k, v))
Моя проблема в том, что я хочу сравнить два словаря, из того, что я мог бы собрать, это должно выглядеть так:
for k1, v1, k2, v2 in zip(gen("root1", v1), gen("root2", v2)):
print("{}: {}".format(k1, v1))
print("{}: {}".format(k2, v2))
print("===========")
Интерпретатор говорит, что возвращаются только два значения, поэтому яПредполагается, что это будет работать (и это работает):
for t1, t2 in zip(gen("root1", v1), gen("root2", v2)):
print("{}: {}".format(t1[0], t1[1]))
print("{}: {}".format(t2[0], t2[1]))
print("===========")
Мой вопрос:
Это может быть чисто преференциальным, но мне действительно интересно
- Как я могузаставить работать первый цикл, чтобы мне не приходилось использовать скобки все время?
- Я пытался распаковать с
*
, но безуспешно.Почему я не могу сделать zip(*gen(...), *gen(...))
?
(Кстати, я знаю, что могу просто добавить k1, v1, k2, v2 = *t1, *t2
в начале цикла, я просто ищу более подходящее решение)