【问题标题】:Sorting by arbitrary lambda按任意 lambda 排序
【发布时间】:2010-07-09 20:40:26
【问题描述】:

如何通过任意函数描述的键对列表进行排序?例如,如果我有:

mylist = [["quux", 1, "a"], ["bar", 0, "b"]]

我想按每个成员的第二个元素对“mylist”进行排序,例如

sort(mylist, key=lambda x: x[1])

我该怎么做?

【问题讨论】:

  • 您尝试提供的代码时遇到了什么问题?

标签: python sorting


【解决方案1】:

你基本上已经拥有了:

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
>>> mylist.sort(key=lambda x: x[1])
>>> print mylist

给予:

[['bar', 0, 'b'], ['quux', 1, 'a']]

这将对 mylist 进行适当的排序。

[感谢@Daniel 的更正,此段落已编辑。]sorted 将返回一个已排序的新列表,而不是实际更改输入,如http://wiki.python.org/moin/HowTo/Sorting/ 中所述。

【讨论】:

    【解决方案2】:

    实际上,您有两个选择,非常接近您的描述:

    mylist.sort(key=lambda x: x[1]) # In place sort
    new_list = sorted(mylist, key=lambda x: x[1])
    

    【讨论】:

      【解决方案3】:

      您的问题的解决方案是: sorted_list = sorted(mylist, key=lambda value:value[1])

      列表字典的解决方案是:

      mylist = [{'name':'kk', 'age':21},{'name':'bk', 'age':21}]
      
      sorted_list = sorted(mylist, key=lambda k: k['key_name'])
      

      【讨论】:

        【解决方案4】:

        这是一个非常普遍的需求,标准库已经添加了对它的支持,形式为operator.itemgetter

        from operator import itemgetter
        mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
        mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
        

        【讨论】:

          【解决方案5】:

          答案是使用“排序”,即

          sorted(mylist, key=lambda x: x[1])
          

          【讨论】:

          • 我把参数倒过来了。似乎不一致,例如map/filter/reduce 采用 lambda 第一个参数并列出第二个参数,但排序相反。
          【解决方案6】:

          排序和 itemgetter 是最快的。

          >>> import operator
          >>> import timeit
          
          >>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
          >>> t1 = timeit.Timer(lambda: mylist.sort(key=lambda x: x[1]))
          >>> t1.timeit()
          1.6330803055632404
          
          >>> t2 = timeit.Timer(lambda: mylist.sort(key=operator.itemgetter(1)))
          >>> t2.timeit()
          1.3985503043467773
          
          >>> t3 = timeit.Timer(lambda: sorted(mylist, key=operator.itemgetter(1)))
          >>> t3.timeit()
          2.6329514733833292
          
          >>> t4 = timeit.Timer(lambda: sorted(mylist, key=lambda x: x[1]))
          >>> t4.timeit()
          2.9197154810598533
          

          【讨论】:

            猜你喜欢
            • 2018-03-29
            • 2011-08-03
            • 2020-07-08
            • 2023-03-23
            • 1970-01-01
            • 1970-01-01
            • 2011-01-13
            • 2011-11-11
            • 1970-01-01
            相关资源
            最近更新 更多