python - 循环多个值的多个生成器

标签 python python-3.x loops dictionary generator

我试图遍历两个给定字典的所有元素以确保它们相等,如果不相等,我想要它们不同的属性的名称。

这是我的基本方法:

# 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("===========")

我的问题:

这可能纯粹是优惠,但我真的很想知道

  1. 如何让第一个循环正常工作,这样我就不必一直使用括号?
  2. 我尝试使用*解压,但没有成功。为什么我不能执行zip(*gen(...), *gen(...))

(顺便说一句,我知道我可以在循环开头添加 k1, v1, k2, v2 = *t1, *t2 ,我只是在寻找更好的解决方案)

最佳答案

您可以按如下方式解压每个返回的元组:

for (k1, val1), (k2, val2) in zip(gen('root1', v1), gen('root2', v2)):
    ...

关于python - 循环多个值的多个生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52898783/

相关文章:

linux - 如何在Linux shell中循环相同格式的文件

java - 我如何循环我的整个程序?

python - 通过 Python subprocess.Popen() 将转义字符传递给 grep -e 命令

python - Cython 中用于循环调用的快速基本线性代数

python - Asyncio 错误,尝试对非套接字的对象进行操作

python-3.x - 如何使用kv语言引用kivy中创建的不同屏幕的小部件?

python - 写操作部分完成

python - Django - 尾部斜杠重置页面标题

django - 如何在 Django Oscar 中执行库存更新过程

javascript - 如何仅在成功时才在循环中运行ajax请求以转到下一个循环值?