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

Python 2和Python 3中的Lambda映射行为,python,lambda,Python,Lambda,我在查看别人在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,而不适用于Python 3,因此

我在查看别人在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,而不适用于Python 3,因此我进行了以下调试:

Python 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
Python 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)
上述代码在Python2中返回
[[4,5,3],[2],[1]]
(正确),在Python3中返回
[[4,5,3],[1]]
(错误)

*[d,e]
[[4,5],[2]][[3]]
,在Python 2中,当处理
[[2]]
时,它将在lambda表达式中自动将
赋值给r。但在Python3中,它将跳过记录

我还发现,在Python2中,如果我将
f
更改为
list(map(lambda l,r:(l或[])+(r或[]),*itertools.zip_longest(d,e))+[[1]]
,它就会工作。然而,它会把b和c的情况搞砸


有人能解释一下修复代码的正确方法吗?另外,我调试代码的方式非常愚蠢(我总是使用打印),有没有更好的方法来调试代码?我是Python新手,使用Jupyter笔记本来运行我的代码。

map
在Python3中没有添加
None
,您需要自己完成。您可能需要使用
zip\u longest
和星图

映射(函数,iterable,…)将函数应用于iterable的每个项 并返回结果列表。如果需要额外的iterable参数 传递时,函数必须接受那么多参数并应用于 来自所有iterables的项目并行。如果一个表短于 另一个假设是扩展为无项。如果函数是 无,假设为身份函数;如果有多个 参数,map()返回由包含 来自所有iterables的对应项(一种转置) 操作)。iterable参数可以是序列或任何iterable 对象结果总是一个列表

返回一个迭代器,该迭代器将函数应用于iterable的每个项, 产生结果。如果传递了其他iterable参数, 函数必须接受那么多参数,并应用于项 从所有的可比性并行。对于多个iterable,迭代器 当最短iterable耗尽时停止。适用于以下情况: 函数输入已经排列到参数元组中,请参见 itertools.starmap()


Python3中的
map
没有添加
None
,您需要自己完成。您可能需要使用
zip\u longest
和星图

映射(函数,iterable,…)将函数应用于iterable的每个项 并返回结果列表。如果需要额外的iterable参数 传递时,函数必须接受那么多参数并应用于 来自所有iterables的项目并行。如果一个表短于 另一个假设是扩展为无项。如果函数是 无,假设为身份函数;如果有多个 参数,map()返回由包含 来自所有iterables的对应项(一种转置) 操作)。iterable参数可以是序列或任何iterable 对象结果总是一个列表

返回一个迭代器,该迭代器将函数应用于iterable的每个项, 产生结果。如果传递了其他iterable参数, 函数必须接受那么多参数,并应用于项 从所有的可比性并行。对于多个iterable,迭代器 当最短iterable耗尽时停止。适用于以下情况: 函数输入已经排列到参数元组中,请参见 itertools.starmap()


此代码不在Python3中运行。此外,即使在修复了打印之后,map在Python3中也是一个迭代器,不能连接到列表。你到底运行了什么?这是一种非常复杂的方式,可以将
[[4]]
分配给
b
[[5]]
分配给
c
…你提供的链接对其他人不起作用。请给出一个不依赖于链接代码的答案。@OlivierMelançon更新了这个问题,很抱歉
a、b、c、d、e、f
——这是您第一次看到Python 2和Python 3之间的区别?我怀疑您的示例不是最简单的。此代码没有在Python3中运行。此外,即使在修复了打印之后,map在Python3中也是一个迭代器,不能连接到列表。你到底运行了什么?这是一种非常复杂的方式,可以将
[[4]]
分配给
b
[[5]]
分配给
c
…你提供的链接对其他人不起作用。请给出一个不依赖于链接代码的答案。@OlivierMelançon更新了这个问题,很抱歉
a、b、c、d、e、f
——这是您第一次看到Python 2和Python 3之间的区别?我怀疑你的例子并不简单。