簡體   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