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

2024-01-03

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

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的排序算法是stable,这意味着相等的元素保持其相对顺序。使用它首先对第二个元素进行排序(按升序排序),然后仅对第一个元素按相反顺序再次对输出进行排序:

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

Using operator.itemgetter() https://docs.python.org/3/library/operator.html#operator.itemgetter代替lambdas 可以让这个过程更快一些(避免为每个元素返回到 Python 解释器):

from operator import itemgetter

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

Demo:

>>> 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()功能 https://docs.python.org/3/library/functools.html#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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用reverse=True参数的情况下对字符串列表进行逆序排序? 的相关文章

随机推荐