【问题标题】:Sort a list of strings based on multiple predicates基于多个谓词对字符串列表进行排序
【发布时间】:2018-01-15 13:38:18
【问题描述】:

给定一个字符串列表:

['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13']

这是调用sorted后正常排序版本的样子:

['abacus', 'azb', 'azz', 'bar', 'bars13', 'foo', 'foo2', 'foo3']

我想先将它们全部排序,然后,对于具有相同首字母的所有字符串,按降序排序。

对于上面的例子,我想要

['azz', 'azb', 'abacus', 'bars13', 'bar', 'foo3', 'foo2', 'foo']

我该怎么做?

【问题讨论】:

    标签: python string list sorting


    【解决方案1】:

    与@COLDSPEED 位于同一行的两遍解决方案:

    >>> import itertools
    >>>
    >>> l = ['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13']
    >>> s = sorted(l, key=lambda x:(x, len(x)))
    >>> t = []
    >>>
    >>> for g, elems in itertools.groupby(s, key=lambda x: x[0]):
    ...     t.extend(reversed(list(elems)))
    >>>
    >>> t
    ['azz', 'azb', 'abacus', 'bars13', 'bar', 'foo3', 'foo2', 'foo']
    

    【讨论】:

      【解决方案2】:

      您可以先按降序排序,然后按第一个字母排序。由于 Python 的排序算法是稳定的,这将导致第二次排序中的所有“关系”(即具有相同首字母的单词)保持与第一次排序相同的相对顺序。

      l = sorted(l, reverse=True)
      l = sorted(l, key=lambda s: s[0])
      

      您也可以通过一次调用sorted() 来执行此操作,如下所示:

      l = sorted(l, key=lambda s: (-ord(s[0]), s), reverse=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 2015-03-26
        • 1970-01-01
        相关资源
        最近更新 更多