繁体   English   中英

大多数pythonic方法将这个元组用Python 2中的lambda解压缩到Python 3中

[英]Most pythonic way to port this tuple unpacking with lambda from Python 2 into Python 3

我有以下Python 2代码,它在lambda中解包一个元组。 这个lambda包含在for循环中。

    for lab, lab_pred, length in zip(labels, labels_pred, sequence_lengths):
        accs += map(lambda (a, b): a == b, zip(lab, lab_pred))

将此移植到Python 3的最佳方法是什么?

我认为最好的解决方案是不使用maplambda ,而是使用list comprehension:

accs += [a == b for a, b in zip(lab, lab_pred)]

如果你喜欢功能风格,有:

from operator import eq
from itertools import starmap

accs.extend(starmap(eq, zip(lab, lab_pred)))

这是Python3中的故意回归(虽然我不知道理由 - 如果你碰巧 - 请在下面评论)以阻止lambda并且从长远来看 - 完全使用Python2。

Pythonic快速修复

(编辑,以前的想法并没有真正起作用)另见: https//stackoverflow.com/a/47947955/1338797

如果你的lambda是扁平的,那么有一条Python3的升级路径:

lambda (x, y): x + y

lambda xy: (lambda x, y: x + y)(*xy)

不错,但它有两个缺点:

  1. 欢迎来到Lisp;)这是错综复杂的(但是str.join ,就像str.join一样)

  2. 它不会剪切嵌套元组,如: lambda ((x0, y0), (x1, y1)): abs(x1-x0) + abs(y1-y0)

  3. 额外的lambda。

他们为什么强迫我们使用小def函数?

Lambdas有几个原因是坏的(大约3-4可能是有效的):

  1. 仅仅因为: lambda在Python中被破坏了。 知道这一点是“pythonic”。

  2. Lambda(在Python中,而不是其他语言!我不会在以下几点重复此免责声明)只能处理单个表达式。

  3. __name__没有__name__

  4. __repr__有丑陋的__repr__表达。

  5. Lambda表达式 可以使代码慢。 (经常不必要地创建)

  6. 兰巴达很慢。 (与竞争构造相比,运行)

(5和6仅在大多数性能关键代码中相关)。

建议使用Python中的小函数,他们认为这没有问题,因为它只需要2行。 (2代替0,因为lambda可以是内联的)。 因此lambda x, y: x == y变为:

def are_equal(x, y):
    return x == y

(在这里忘记operator.eq ,并不是每个lambda都会在这个模块中具有相同的功能)。

实际上,如果你坚持使用PEP-8,这个函数在本地范围内需要额外增加4行,在全局范围内增加6行,包括空行填充。

示例情况:如何保持兼容性

假设您有一个列表或其他可迭代的元组。 您希望使用max(..., key=...)获得最大值。 之后,您可以直接解压缩元组。 在Python2的时代,它将是:

x, y, w, h = max(faces, key=lambda (x, y, w, h): w * h)

(同样,你可以在这里演讲我讲的优越性typing.Namedtuple S, dataclasses ,或@attr.s ,但现在我得到一个listtuple来自OpenCV的秒。

我找到了使用函数最不痛苦的方法:

def face_area(*args):
    x, y, w, h = args if len(args) == 4 else args[0]
    return w * h

 x, y, w, h = max(faces, key=face_area)

Python2将在args获得嵌套元组,Python3将获得长度为4的元组。您可以如上所述手动解压缩,然后继续return结果。

有人会说,它为代码提供了一个更加自我记录的机会,因为我不得不考虑key函数的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM