如何使用两个键对列表进行排序,但其中一个键的顺序相反?

新手上路,请多包涵

我想知道什么是通过两个键对元组列表进行排序的 Pythonic 方式,其中使用一个(且只有一个)键排序将以相反的顺序进行,而使用另一个键排序将不区分大小写。更具体地说,我有一个包含如下元组的列表:

 myList = [(ele1A, ele2A),(ele1B, ele2B),(ele1C, ele2C)]

我可以使用以下代码通过两个键对其进行排序:

 sortedList = sorted(myList, key = lambda y: (y[0].lower(), y[1]))

要按相反的顺序排序,我可以使用

sortedList = sorted(myList, key = lambda y: (y[0].lower(), y[1]), reverse = True)

但这会用两个键以相反的顺序排序。

原文由 Stanisław Łabądź 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 365
2 个回答

当我们需要对具有两个约束的列表进行排序时,将使用两个键:一个按升序排列,另一个按降序排列,在同一列表或任何

在你的例子中,

 sortedList = sorted(myList, key = lambda y: (y[0].lower(), y[1]))

您只能按一个顺序对整个列表进行排序。

您可以尝试这些并检查发生了什么:

 sortedList = sorted(myList, key = lambda y: (y[0].lower(), -y[1]))
sortedList = sorted(myList, key = lambda y: (-y[0].lower(), y[1]))
sortedList = sorted(myList, key = lambda y: (-y[0].lower(), -y[1]))

原文由 Venkat Ramana 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以创建一个逆向器类并使用它来装饰有问题的密钥。此类可用于反转任何可比较的字段。

 class reversor:
    def __init__(self, obj):
        self.obj = obj

    def __eq__(self, other):
        return other.obj == self.obj

    def __lt__(self, other):
           return other.obj < self.obj

像这样使用它:

 sortedList = sorted(myList, key=lambda y: (y[0].lower(), reversor(y[1])))

原文由 black panda 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题