为了账号安全,请及时绑定邮箱和手机立即绑定

Python 2 和 Python 3 中的 Lambda 映射行为

Python 2 和 Python 3 中的 Lambda 映射行为

翻过高山走不出你 2021-06-07 12:38:36
我在 LeetCode 上查看别人的解决方案时遇到了一些代码:def findLeaves(self, root):    if not root: return []    kids = map(self.findLeaves, (root.left, root.right))    return map(lambda l, r: (l or []) + (r or []), *kids) + [[root.val]]我发现它只适用于 Python 2 而不适用于 3,所以我做了以下调试:蟒蛇2:a = [[],[]]b = map(lambda l, r: (l or []) + (r or []), *a) + [[4]]c = map(lambda l, r: (l or []) + (r or []), *a) + [[5]]d = map(lambda l, r: (l or []) + (r or []), *[b,c]) + [[2]]e = [[3]]f = map(lambda l, r: (l or []) + (r or []), *[d,e]) + [[1]]print f蟒蛇3:a = [[],[]]b = list(map(lambda l, r: (l or []) + (r or []), *a)) + [[4]]c = list(map(lambda l, r: (l or []) + (r or []), *a)) + [[5]]d = list(map(lambda l, r: (l or []) + (r or []), *[b,c])) + [[2]]e = [[3]]f = list(map(lambda l, r: (l or []) + (r or []), *[d,e])) + [[1]]print(f)上面的代码[[4, 5, 3], [2], [1]]在 Python 2(正确)和[[4, 5, 3], [1]]Python 3(错误)中返回。*[d,e]is [[4,5], [2]] [[3]],在 Python 2 中,处理[[2]]时它将自动分配None给 lambda 表达式中的 r。但是在 Python 3 中,它会跳过记录。我还发现,在Python 2,假如我换f到list(map(lambda l, r: (l or []) + (r or []), *itertools.zip_longest(d,e))) + [[1]],它会工作。但是,它会弄乱 b 和 c 的情况。谁能解释一下修复代码的正确方法是什么?另外,我调试的方式非常愚蠢(我总是使用打印),有没有更好的调试代码的方法?我是 Python 新手并使用 Jupyter notebook 来运行我的代码。
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

map在 python 3 中没有填充None,你需要自己做。您可能想要使用zip_longest星图。

地图的 Python 2 文档

map(function, iterable, ...) 将 function 应用于 iterable 的每个项目并返回结果列表。如果传递了额外的可迭代参数,则函数必须采用那么多参数并并行应用于所有可迭代项中的项目。如果一个迭代比另一个更短,则假定使用 None 项进行扩展。如果 function 为 None,则假定恒等函数;如果有多个参数,则 map() 返回一个由元组组成的列表,该列表包含来自所有可迭代对象的相应项(一种转置操作)。可迭代参数可以是序列或任何可迭代对象;结果总是一个列表。

地图的 Python 3 文档

返回一个迭代器,该迭代器将函数应用于可迭代的每个项目,产生结果。如果传递了额外的可迭代参数,则函数必须采用那么多参数并并行应用于所有可迭代项中的项目。对于多个可迭代对象,当最短的可迭代对象耗尽时,迭代器将停止。对于函数输入已经排列成参数元组的情况,请参阅 itertools.starmap()。


查看完整回答
反对 回复 2021-06-09
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号