【问题标题】:How to specify 2 keys in python sorted(list)?如何在 python 排序(列表)中指定 2 个键?
【发布时间】:2013-05-07 02:44:27
【问题描述】:

如何先按key=len 然后按key=str 对字符串列表进行排序? 我尝试了以下方法,但没有给我想要的排序:

>>> ls = ['foo','bar','foobar','barbar']
>>> 
>>> for i in sorted(ls):
...     print i
... 
bar
barbar
foo
foobar
>>>
>>> for i in sorted(ls, key=len):
...     print i
... 
foo
bar
foobar
barbar
>>> 
>>> for i in sorted(ls, key=str):
...     print i
... 
bar
barbar
foo
foobar

我需要得到:

bar
foo
barbar
foobar

【问题讨论】:

    标签: python list sorting key


    【解决方案1】:

    定义一个返回元组的键函数,其中第一项是len(str),第二项是字符串本身。然后按字典顺序比较元组。也就是说,首先比较长度;如果它们相等,则比较字符串。

    In [1]: ls = ['foo','bar','foobar','barbar']
    
    In [2]: sorted(ls, key=lambda s: (len(s), s))
    Out[2]: ['bar', 'foo', 'barbar', 'foobar']
    

    【讨论】:

    • 如果性能很重要,只需 2c:独立函数应该比 lambda 快得多。
    • @Eric - Duh...经过测试 - 我不得不说确实没有任何性能差异。
    • 嗯测试后,我撤销了我的评论,确实没有区别。是我的一些偏见。
    【解决方案2】:

    如果你不想使用 lambda:

    from operator import itemgetter
    ls = ['foo','bar','foobar','barbar']
    print sorted([ [x,len(x)] for x in ls ] ,key=itemgetter(1,0))
    # print [s[0] for s in sorted([ [x,len(x)] for x in ls ] ,key=itemgetter(1,0))]
    

    【讨论】:

    • 这比 lambda 更难看,因为你在结果中引入了 cruft,需要额外的 [0] 才能访问结果
    • 是的,与 lambda 相比,它的执行时间是 x2
    • 另外,对我来说 key_function 的执行时间是 lambda 版本的 1.2 倍
    【解决方案3】:

    另一种无需 lambda 的形式:

    >>> [t[1] for t in sorted((len(s),s) for s in ls)]
    ['bar', 'foo', 'barbar', 'foobar']
    

    【讨论】:

    • key 已创建,因此您无需使用 DSU
    【解决方案4】:

    root 的答案是正确的,但你并不真的需要 lambda

    >>> def key_function(x):
            return len(x), str(x)
    
    >>> sorted(['foo','bar','foobar','barbar'], key=key_function)
    ['bar', 'foo', 'barbar', 'foobar']
    

    此外,还有一种利用排序稳定性的替代方法,可让您分多次排序(首先使用辅助键):

    >>> ls = ['foo','bar','foobar','barbar']
    >>> ls.sort(key=str)                       # secondary key
    >>> ls.sort(key=len)                       # primary key
    

    请参阅Sorting HOWTO,获取有关 Python 排序技术的优秀教程。

    【讨论】:

    • 好吧,我想说这里不需要完整的功能:)(顺便说一句,你缺少, key=key_function)
    • 面对初学者问题时,我通常不会在答案中使用 lambda,而是使用最简单的答案公式。如果有人问这个关于排序和键函数的问题,那么这表明他们对 lambda 并不满意。
    • 点了。我想我读到它是因为在这种情况下使用 lambdas 通常应该不鼓励。
    猜你喜欢
    • 2013-11-17
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多