【问题标题】:Equivalent Function To the lamda function等效函数到 lambda 函数
【发布时间】:2020-09-23 00:13:25
【问题描述】:

我有这份清单。

a = ["1.dat", "3.dat", "2.dat", "4.dat", "6.dat", "5.dat", "21.dat", "25.dat", "15.dat", "9.dat"]

我想对这个列表进行排序,

['1.dat', '2.dat', '3.dat', '4.dat', '5.dat', '6.dat', '9.dat', '15.dat', '21.dat', '25.dat']

所以我试过了,它奏效了。

a.sort(key=lambda item: (len(item), item))
print(a)

我的问题是这个lamda 函数的等效用户定义函数是什么?

【问题讨论】:

  • 你的两个列表不一样——有点混乱
  • 抱歉代码错误。现在它被编辑了。 @Stefan
  • lambda 是一个用户定义的函数,但这只是def _unamed(item): return (len(item, item))

标签: python python-3.x list function sorting


【解决方案1】:

Python 中的任何 lambda 结构都是这样的:

lambda <optional parameters>: <return value expression>

因此,要将 lambda 重写为普通的用户定义函数,您可以简单地:

def function_name(<optional parameters>):
    return <return value expression>

在你的情况下:

lambda item: (len(item), item)

变成:

def key_func(item):
    return len(item), item

请注意,在这种情况下不需要括号。

所以你的排序代码变成了:

a.sort(key=key_func)
print(a)

使用您的数据进行测试:

a = ["1.dat", "3.dat", "2.dat", "4.dat", "6.dat", "5.dat", "21.dat", "25.dat", "15.dat", "9.dat"]


def key_func(item):
    return len(item), item


a.sort(key=key_func)
print(a)

.sort() 函数采用key 提供的函数,并为列表的每个元素调用它,将该元素传递给key 函数并使用返回值作为排序键。

【讨论】:

  • 为什么这里实际上不需要参数?如何在不知道参数值的情况下得到 x 的长度?
  • 我不确定我是否理解这个问题。函数key_func 将字符串item 作为参数并返回字符串len(item) 的长度和字符串本身item,就像你的lambda 所做的那样。由于该值元组以长度开头,因此您的 a 最终按长度排序,然后按名称排序。 x 是什么意思,为什么您认为 key_func 或 sort() 无法访问每个项目的长度?我添加了一个简短的解释,也许可以回答您的问题?
  • 我的错误。不是 x。我说的是item。对此感到抱歉。我的问题是如何将字符串一一分配给项目?因为没有值传递给函数key_func。并返回字符串的长度!
  • 好的,我明白了 - 请参阅我的回答中的最后一句话。 a 上的 .sort() 方法自动为它想知道其键的每个元素调用 key_func,通常为列表中的每个元素调用一次。由于您正在对列表进行排序,并且您将 key_func 作为其 key 参数传递,因此它知道使用单个参数调用 key_func,即列表中的每个元素以某种顺序取决于排序算法。
【解决方案2】:

您可以将function 作为key 传递

你不添加括号,就好像你这样做意味着你正在运行函数,如果你不这样做意味着你正在初始化函数的关键变量。

基本上对于任何函数xyz() 如果我这样做 a = xyz() 是存储函数的输出但如果我这样做 a = xyz 我可以将 xyz 称为 a()

我们希望我们的排序函数调用 key 来获取排序对象,而不是存储值

a = ["1.dat", "3.dat", "2.dat", "4.dat", "6.dat", "5.dat", "21.dat", "25.dat", "15.dat", "9.dat"]

a.sort(key=lambda item: (len(item), item))
print(a)

a = ["1.dat", "3.dat", "2.dat", "4.dat", "6.dat", "5.dat", "21.dat", "25.dat", "15.dat", "9.dat"]


#THIS IS YOUR FUNCTION
def keyFnc (x):
    return len(x) , x


a.sort(key=keyFnc)
print(a)

a = ["1.dat", "33.dat", "222.dat", "4444.dat", "6.dat", "5.dat", "21.dat", "25.dat", "15.dat", "9.dat"]

a.sort(key=keyFnc)
print(a)
['1.dat', '2.dat', '3.dat', '4.dat', '5.dat', '6.dat', '9.dat', '15.dat', '21.dat', '25.dat']
['1.dat', '2.dat', '3.dat', '4.dat', '5.dat', '6.dat', '9.dat', '15.dat', '21.dat', '25.dat']
['1.dat', '5.dat', '6.dat', '9.dat', '15.dat', '21.dat', '25.dat', '33.dat', '222.dat', '4444.dat']

您可以将变量分配给 python 中的函数,因为它们被视为一等对象

【讨论】:

  • 好吧。这个有效。但是需要它实际上是如何工作的? keyFnc 有一个参数,但它没有传递任何值。在返回 len(x), x 之后实际做了什么?
【解决方案3】:

你可以像给定的belove一样单独定义函数

a = ["1.dat", "3.dat", "2.dat", "4.dat", "6.dat", "5.dat", "21.dat", "25.dat", "15.dat", "9.dat"]

#a.sort(key=lambda item: (len(item), item))
#print(a)
def key_func(x):
    return (len(x),x)

a.sort(key=key_func)
print(a)

#output
#['1.dat', '2.dat', '3.dat', '4.dat', '5.dat', '6.dat', '9.dat', '15.dat', '21.dat', '25.dat']

试试这个,如果有任何疑问,请告诉我

【讨论】:

  • 这不起作用。 “15.dat”在结尾。它应该在“9.dat”之后。
  • 再试一次然后告诉我@HasibulIslamPolok
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2016-01-27
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多