【问题标题】:What is key=lambda什么是键=lambda
【发布时间】:2012-11-20 02:13:13
【问题描述】:

在使用一些内置函数时,例如 sorted、sum... 我注意到key=lambda的用法

什么是 lambda?它是如何工作的?

还有哪些函数使用 key=lambda?

是否还有其他键值,例如 key=?

【问题讨论】:

标签: python lambda key


【解决方案1】:

lambda 是一个匿名函数:

>>> f = lambda: 'foo'
>>> print f()
foo

它通常用于sorted() 等将可调用对象作为参数的函数(通常是key 关键字参数)。你也可以提供一个现有的函数来代替lambda,只要它是一个可调用的对象。

sorted() function 为例。它将按排序顺序返回给定的迭代:

>>> sorted(['Some', 'words', 'sort', 'differently'])
['Some', 'differently', 'sort', 'words']

但这会将大写单词排在小写单词之前。使用key 关键字,您可以更改每个条目,以便对其进行不同的排序。我们可以在排序前将所有单词小写,例如:

>>> def lowercased(word): return word.lower()
...
>>> lowercased('Some')
'some'
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased)
['differently', 'Some', 'sort', 'words']

我们必须为此创建一个单独的函数,我们不能将 def lowercased() 行内联到 sorted() 表达式中:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
  File "<stdin>", line 1
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
                                                           ^
SyntaxError: invalid syntax

另一方面,lambda 可以直接指定,内联在sorted() 表达式中:

 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())
['differently', 'Some', 'sort', 'words']

Lambda 仅限于一个表达式,其结果是返回值。

Python 库中有很多地方,包括内置函数,它们将可调用对象作为关键字或位置参数。这里有太多的名字,而且他们经常扮演不同的角色。

【讨论】:

    【解决方案2】:

    在 Python 中,lambda 是用于定义 匿名函数(没有名称的函数)的关键字,这就是为什么它们被称为 lambda 函数.

    基本上它用于定义可以/不能接受argument(s)匿名函数并返回数据/表达式的值。让我们看一个示例

    >>> # Defining a lambda function that takes 2 parameters(as integer) and returns their sum
    ... 
    >>> lambda num1, num2: num1 + num2 
    <function <lambda> at 0x1004b5de8>
    >>> 
    >>> # Let's store the returned value in variable & call it(1st way to call)
    ... 
    >>> addition = lambda num1, num2: num1 + num2
    >>> addition(62, 5)
    67
    >>> addition(1700, 29)
    1729
    >>> 
    >>> # Let's call it in other way(2nd way to call, one line call )
    ... 
    >>> (lambda num1, num2: num1 + num2)(120, 1)
    121
    >>> (lambda num1, num2: num1 + num2)(-68, 2)
    -66
    >>> (lambda num1, num2: num1 + num2)(-68, 2**3)
    -60
    >>> 
    

    现在让我回答你的第二个问题。 第一个答案也很棒。这是我自己用另一个例子来解释的方式。

    假设我们有一个项目列表(整数带有数字内容的字符串),如下所示,

    nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
    

    我想使用 sorted() 函数对其进行排序,让我们看看会发生什么。

    >>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
    >>> sorted(nums)
    [1, 3, 4, '-1', '-10', '2', '5', '8']
    >>>
    

    它没有给我期望,因为我想要如下所示,

    ['-10', '-1', 1, '2', 3, 4, '5', '8']
    

    这意味着我们需要一些策略(以便 sorted 可以将我们的字符串项视为整数)来实现这一点。这就是使用 key 关键字参数的原因。请看下面的。

    >>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
    >>> sorted(nums, key=int)
    ['-10', '-1', 1, '2', 3, 4, '5', '8']
    >>> 
    

    让我们使用 lambda 函数作为 key

    的值
    >>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"]
    >>> names2 = sorted(names)
    >>> names2
    ['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep']
    >>> # But I don't want this o/p(here our intention is to treat 'a' same as 'A')
    ...
    >>> names3 = sorted(names, key=lambda name:name.lower())
    >>> names3
    ['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra']
    >>>
    

    您可以定义自己的函数(callable)并将其作为key的值提供。

    亲爱的程序员,我已经为你写了下面的代码,试着理解它并评论你的解释。我很高兴看到你的解释(很简单)。

    >>> def validator(item):
    ...     try:
    ...         return int(item)
    ...     except:
    ...         return 0
    ... 
    >>> sorted(['gurmit', "0", 5, 2, 1, "front", -2, "great"], key=validator)
    [-2, 'gurmit', '0', 'front', 'great', 1, 2, 5]
    >>>
    

    希望它会有用

    【讨论】:

      【解决方案3】:

      Lambda 可以是任何函数。所以如果你有一个函数

      def compare_person(a):
               return a.age
      

      你可以像这样对一个 Person 列表(每个都有一个 age 属性)进行排序:

      sorted(personArray, key=compare_person)
      

      这样,列表将按年龄升序排序。

      该参数被称为 lambda,因为 python 有一个漂亮的 lambda 关键字用于动态定义此类函数。除了定义函数 compare_person 并将其传递给 sorted 之外,您还可以编写:

      sorted(personArray, key=lambda a: a.age)
      

      做同样的事情。

      【讨论】:

        【解决方案4】:
         >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())
        

        其实上面的代码可以是:

        >>> sorted(['Some','words','sort','differently'],key=str.lower)
        

        根据https://docs.python.org/2/library/functions.html?highlight=sorted#sorted,key 指定一个参数的函数,用于从每个列表元素中提取比较键:key=str.lower。默认值为None(直接比较元素)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-21
          • 2010-09-06
          • 1970-01-01
          相关资源
          最近更新 更多