python - 循环多个值的多个生成器
问题描述
我正在尝试遍历两个给定字典的所有元素以确保它们相等,如果不是,我想要它们不同的属性名称。
这是我的基本方法:
# 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
在循环的开头添加,我只是在寻找一个更好的解决方案)
解决方案
您可以按如下方式解压缩每个返回的元组:
for (k1, val1), (k2, val2) in zip(gen('root1', v1), gen('root2', v2)):
...
推荐阅读
- python - 程序初始输出旁边的 Python 和 Excel 日期更新
- java - Java-用户选择后菜单未启动选项循环(无编译错误)
- javascript - 如何修复迷你 Javascript 游戏上的开始按钮?
- jquery - 通过使用jquery单击它来选中/取消选中单选按钮
- android - 我正在尝试使用此代码从应用程序的资产中共享 pdf 但它显示错误
- reactjs - 我可以在片段上使用指令并有条件地调用其变量吗?
- flutter - 我可以通过 Flutter Widget 实现视频播放器吗?
- php - PHP API json_encode 编码不响应 MySQL 查询
- java - PDFBox2 的 Unicode 字体书写问题(U+0053 没有字形)
- c++ - 不产生值的表达式的示例是什么?