Sorting by arbitrary lambda

后端 未结 6 940
臣服心动
臣服心动 2020-12-15 14:58

How can I sort a list by a key described by an arbitrary function? For example, if I have:

mylist = [[\"quux\", 1, \"a\"], [\"bar\", 0, \"b\"]]
相关标签:
6条回答
  • 2020-12-15 15:26

    Solution of your question is: sorted_list = sorted(mylist, key=lambda value:value[1])

    Solution for dictionary of list is:

    mylist = [{'name':'kk', 'age':21},{'name':'bk', 'age':21}]
    
    sorted_list = sorted(mylist, key=lambda k: k['key_name'])
    
    0 讨论(0)
  • 2020-12-15 15:27

    The answer is to use "sorted", i.e.

    sorted(mylist, key=lambda x: x[1])
    
    0 讨论(0)
  • 2020-12-15 15:35

    This is such a common need that support for it has been added to the standard library, in the form of operator.itemgetter:

    from operator import itemgetter
    mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
    mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
    
    0 讨论(0)
  • 2020-12-15 15:37

    You basically have it already:

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

    gives:

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

    That will sort mylist in place.

    [this para edited thanks to @Daniel's correction.] sorted will return a new list that is sorted rather than actually changing the input, as described in http://wiki.python.org/moin/HowTo/Sorting/.

    0 讨论(0)
  • 2020-12-15 15:38

    You have two options, very close to what you described, actually:

    mylist.sort(key=lambda x: x[1]) # In place sort
    new_list = sorted(mylist, key=lambda x: x[1])
    
    0 讨论(0)
  • 2020-12-15 15:47

    Sort and itemgetter is the fastest.

    >>> 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
    
    0 讨论(0)
提交回复
热议问题