当前位置: 首页 > 面试题库 >

如何在不使用reverse = True参数的情况下以相反顺序对字符串列表进行排序?

聂迪
2023-03-14
问题内容

我想以相反的顺序对字符串列表进行排序,例如:

my_list = ['aaa', 'bbb', 'ccc']

预期结果:

['ccc', 'bbb', 'aaa']

我不想使用sorted(my_list, reverse=True),因为在更复杂的情况下,按两个值进行过滤将无法正常工作。例如:

my_list2 = [('aaa', 'bbb'), ('aaa', 'ccc'), ('bbb', 'aaa'), ('bbb', 'ccc')]

预期结果将是:

[('bbb', 'aaa'), ('bbb', 'ccc'), ('aaa', 'bbb'), ('aaa', 'ccc')]

sorted(my_list2, reverse=True) 返回:

[('bbb', 'ccc'), ('bbb', 'aaa'), ('aaa', 'ccc'), ('aaa', 'bbb')]

数字很​​简单,您可以取反值:

>>> my_list3 = [(1, 2), (1, 3), (2, 1), (2, 3)]
>>> sorted(my_list3, key=lambda x: (-x[0], x[1]))
... [(2, 1), (2, 3), (1, 2), (1, 3)]

但是如何使用字符串呢?


问题答案:

您将不得不排序两次。Python的sort算法 稳定
,这意味着相等的元素保持其相对顺序。使用它首先对第二个元素进行排序(以升序排序),然后仅对第一个元素以相反的顺序再次对输出进行排序:

sorted(sorted(my_list2, key=lambda t: t[1]), key=lambda t: t[0], reverse=True)

使用operator.itemgetter()而不是lambdas可以使速度更快(避免对每个元素退回到Python解释器):

from operator import itemgetter

sorted(sorted(my_list2, key=itemgetter(1)), key=itemgetter(0), reverse=True)

演示:

>>> from operator import itemgetter
>>> my_list2 = [('aaa', 'bbb'), ('aaa', 'ccc'), ('bbb', 'aaa'), ('bbb', 'ccc')]
>>> sorted(sorted(my_list2, key=lambda t: t[1]), key=lambda t: t[0], reverse=True)
[('bbb', 'aaa'), ('bbb', 'ccc'), ('aaa', 'bbb'), ('aaa', 'ccc')]
>>> sorted(sorted(my_list2, key=itemgetter(1)), key=itemgetter(0), reverse=True)
[('bbb', 'aaa'), ('bbb', 'ccc'), ('aaa', 'bbb'), ('aaa', 'ccc')]

一般规则是从最内层元素到最外层元素排序。因此,对于任意元素计数排序(每个都有一个键和一个反向布尔值),可以使用该functools.reduce()函数来应用它们:

from functools import reduce
from operator import itemgetter

def sort_multiple(sequence, *sort_order):
    """Sort a sequence by multiple criteria.

    Accepts a sequence and 0 or more (key, reverse) tuples, where
    the key is a callable used to extract the value to sort on
    from the input sequence, and reverse is a boolean dictating if
    this value is sorted in ascending or descending order.

    """
    return reduce(
        lambda s, order: sorted(s, key=order[0], reverse=order[1]),
        reversed(sort_order),
        sequence
    )

sort_multiple(my_list2, (itemgetter(0), True), (itemgetter(1), False))


 类似资料:
  • 问题内容: 我正在尝试按升序对任意长度整数的数字进行排序,而不使用字符串,数组或递归。 例: 我已经弄清楚如何用模数除法获得整数的每个数字: 但是我不知道如何在没有数组的情况下排序数字。 不用担心上课;这是我们教授给我们的习俗课。 问题答案: 实际上有一个非常简单的算法,它 仅 使用 整数 : 它会打印出来。这个想法很简单: 您将要排序的数字作为当前数字(我们称其为N) 您可以浏览已排序数字中的所

  • 问题内容: 我一直在寻找一种不用使用collections.sort就可以对数组列表进行排序的方法,因为我自己的逻辑有缺陷,而且我遇到了很多麻烦。 我需要对它进行排序,以便可以使用我创建的一种方法,该方法基本上可以执行collections.swap的工作,以便对数组列表进行完全排序。 这是我的代码: 我对此一直很烦恼。抱歉,这是在伤害社区。 问题答案: 我想,你希望下面的算法:在阵列的其余部分发

  • 我正在尝试对字符串进行大小写排序--不敏感地不导入任何东西。使用很容易做到这一点,但我想不出没有它的方法。我只把它分类到acdabcce...有什么想法吗?

  • 问题内容: 我知道这听起来微不足道,但是我没有意识到 的功能很奇怪。我有一个实际上是字符串形式的“数字”列表,因此我先将它们转换为整数,然后尝试进行排序。 给我: 我想要的是 我四处寻找与排序数字集相关的算法,但是我发现所有算法都涉及对字母数字集进行排序。 我知道这可能是个没有脑子的问题,但是google和我的教科书没有提供比该.sort()功能有用的功能。 问题答案: 您实际上尚未将字符串转换为

  • 问题内容: 我正在尝试对包含数字的字符串列表进行排序 但是列表是排序而不是列表 问题答案: 您要基于值(而不是字符串值)进行排序,因此请尝试:

  • 问题内容: 在Python中创建按字母顺序排序的列表的最佳方法是什么? 问题答案: 基本答案: 这会修改你的原始列表(即就地排序)。要获得列表的排序副本,而无需更改原始副本,请使用以下函数: 但是,上面的示例有些天真,因为它们没有考虑区域设置,而是执行区分大小写的排序。你可以利用可选参数key指定自定义排序顺序(使用,则是不推荐使用的解决方案,因为它必须多次评估- key每个元素仅计算一次)。 因