python - 被 sorted(..., key=lambda...) 搞糊涂了

标签 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。

对于第二个 lambda alphanum_key我很困惑。似乎将 key 传递给 lambda 并在 split() 中使用re 中的函数模块,但我没有看到 key传入了alphanum_keysorted() 中调用此 lambda 时的 lambda功能。

我写了个小程序看看能不能正常创建def通过返回值和像函数一样调用显然使用错误形式的 lambda 函数。这是我的代码:

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']

这就引出了第二个问题……为什么正常的def模仿 lambda 函数的函数返回不同和不正确的结果。如果您不想在您的机器上运行该程序,请注意代码注释中返回的结果。

最佳答案

你说你了解第一个函数 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

关于python - 被 sorted(..., key=lambda...) 搞糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54045855/

相关文章:

python - 按天重新采样并对具有日期时间开始和日期时间结束的 DataFrame 进行分类

python - 使用 Pandas 从列表的一列中减去另一列中的值

python - 在循环中设置对象属性会导致所有属性具有相同的值

C++11 "overloaded lambda"带有可变参数模板和变量捕获

c++ - 如何在 C++ 中使用 Null Lambda?

python - 迭代文件并替换字符串,保持字符数不变

python - C9 IDE - 未找到 Conda 命令

python - 如何从字符串(Wireshark 输出)中提取某些子字符串(IP 地址)?

.net - 对象不为空的排序列表

java - 不能将下划线作为参数的方法重构到 lambda 中吗?