被sorted(...,key = lambda ...)

时间:2019-01-04 20:49:03

标签: python lambda

有人可以解释这些lambda吗?我对以下代码感到相当困惑,希望能从了解此事的人那里获得一些帮助,以帮助他们理解代码,并且可以将代码分解为可理解的组件。

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(l, key = alphanum_key)

(来源:https://arcpy.wordpress.com/2012/05/11/sorting-alphanumeric-strings-in-python/

我了解第一个lambda。

对于第二个alphanum_key,我感到困惑。似乎已将密钥传递给lambda并在split()模块的re函数中使用了,但是我看不到key传递给alphanum_key lambda在sorted()函数中调用此lambda时。

我写了一个小程序,看看是否可以通过返回值并像函数一样被调用的lambda创建正常的def函数。这是我的代码:

import re

def convert2(text):
    if text.isdigit():
        return int(text)
    else:
        return text

def alphanum_key2(key):
    a_list = []
    for i in re.split('([0-9]+)', key):
        a_list.append(convert2(i))

    return a_list


if __name__ == "__main__":
    things = ["10bags", "500miles", "10000maniacs", "2000lightYearsFromHome"]
    x = sorted(things, key= alphanum_key2)
    print(x)
    #This prints
    #['10bags', '500miles', '2000lightYearsFromHome', '10000maniacs']

    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
    print(sorted(things, key = alphanum_key))
    #This prints
    #['10bags', '500miles', '2000lightYearsFromHome', '10000maniacs']

这导致了第二个问题...为什么模拟Lambda函数的普通def函数返回不同且错误的结果。如果您不希望在计算机上运行该程序,请注意代码注释中返回的结果。

1 个答案:

答案 0 :(得分:1)

您说您了解第一个功能convert,所以我不再赘述;只是要知道它返回的是字符串还是整数。

第二个从lambda的直接转换是:

def alphanum_key(key):
    return [convert(c) for c in re.split('([0-9]+)', key)]

让我们分解一下。

[... for ...]

这是列表理解。它将为for的每次迭代创建一个包含元素的列表。

re.split('([0-9]+)', key)

这使用由所有数字([0-9])重复一次或多次(+)组成的正则表达式。通过在该表达式两边加上括号,这些匹配项将包含在split的输出中。

>>> re.split('([0-9]+)', "10bags")
['', '10', 'bags']

由于split在比赛中将字符串分开,并在比赛之前和之后返回部分,因此开头有一个空字符串。

alphanum_key的最终输出将为['', 10, 'bags'],因为'10'将被转换为整数10。这很重要,因为您要比较数字:

>>> '10000' < '500'
True
>>> 10000 < 500
False