【问题标题】:Where does the lambda parameter originate?lambda 参数从何而来?
【发布时间】:2019-05-16 14:08:49
【问题描述】:

我参考How to sort (list/tuple) of lists/tuples?给出的解决方案。

sorted_by_second = sorted(data, key=lambda tup: tup[1])

data.sort(key=lambda tup: tup[1])  # sorts in place

tup 在哪一个排序函数中传递给 lambda 函数?

【问题讨论】:

  • 我推荐你阅读this的文章。

标签: python


【解决方案1】:

tuplambda 的参数。

lambda tup: tup[1]

相当于:

def anonymous_func(tup):
    return tup[1]

【讨论】:

    【解决方案2】:

    sort 本身。 key 参数是一个回调函数,sort 调用它正在排序的序列的每个元素。它可以让您以更简洁的方式编写如下内容:

    new_data = [(tup[1], tup) for tup in data]
    tmp  = sorted(data)
    sorted_by_second = [orig for _, orig in tmp]
    

    【讨论】:

      【解决方案3】:

      在lambda函数lambda tup: tup[1]中,tup指的是列表data的元素,tup[1]指的是item的第二个元素。

      当你将它传递给sorted 函数时,你告诉它使用列表中项目的第二个元素作为比较键,所以你得到的结果是第二个元素上的排序列表

      来自文档

      key 指定一个参数的函数,用于从可迭代的每个元素中提取比较键(例如,key=str.lower)。默认值为None(直接比较元素)。

      因此行为如下

      In [54]: data = [[4,5,6], [1,2,3], [7,8,9]]                                                                                                                                                             
      
      In [55]: sorted_by_second = sorted(data, key=lambda tup: tup[1]) 
      
      In [56]: sorted_by_second                                                                                                                                                                               
      Out[56]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
      

      请注意,您也可以使用operator.itemgetter 来做同样的事情,它会自动从元组中挑选第二个元素

      In [60]: import operator  
      In [64]: data = [[4,5,6], [1,2,3], [7,8,9]]                                                                                                                                                             
      In [65]: sorted_by_second = sorted(data, key=operator.itemgetter(1))                                                                                                                                    
      In [66]: sorted_by_second                                                                                                                                                                               
      Out[66]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
      

      【讨论】:

        【解决方案4】:

        这里的key 是一个变换函数,应用于数组的每个元素以提供一个新值,然后将使用该新值对数组进行排序。从本质上讲,这使得元素应该在基于 if key(a) < key(b) 而不是 a < b 的元素之前排序。

        list.sortsorted 函数将为每个元素单独调用 key

        【讨论】:

          猜你喜欢
          • 2022-10-13
          • 2018-09-09
          • 2015-11-09
          • 1970-01-01
          • 2020-10-04
          • 1970-01-01
          • 2018-12-24
          • 2015-12-04
          • 2018-07-31
          相关资源
          最近更新 更多