【问题标题】:Sorting a list of string by descending order using `key` argument without `reverse=True`?使用没有“reverse=True”的“key”参数按降序对字符串列表进行排序?
【发布时间】:2015-07-15 17:14:31
【问题描述】:

我有一个这样的列表:

fruits = ["blueberry", "peach", "applepine", "orange", "pear", "coconut", "lemon"]


我需要按照以下规则对其进行排序:

  • 名称包含 5 个或更少字母的水果在前
  • 然后,水果按字母倒序排列

这应该给出以下列表:

sorted_fruits = ["pear", "peach", "lemon", "orange", "coconut", "blueberry", "applepine"]

我想对包含字符串的列表应用反向字母排序,但我不能使用可选参数 reverse=True,因为这种情况在我的排序优先级中排在第二位,所以我必须使用 lambda 函数和 key论据。

我该如何处理?

我知道通常我们可以否定int,但我不知道string 对象的技巧,(我想[-ord(i) for i in fruit] 但它看起来很难看)。

【问题讨论】:

  • 名字5个字母以下的水果顺序不重要?
  • reversed 函数怎么样?
  • @AnandSKumar 它们也应该按字母顺序颠倒。
  • 有什么理由不简单地排序两次吗?
  • @DSM 在性能方面的“优化”解决方案会更有趣。

标签: python list sorting python-3.x


【解决方案1】:

您可以“人为地”反转密钥的第一部分,以便使用 reverse=True 得到所需的结果:

sort_key = lambda f: ( len(f)<=5, f )
sorted(fruits, key = sort_key, reverse = True)

条件len(f)&lt;=5 为长字符串给出 0 (=False),为短字符串给出 1 (=True),因此长字符串在短字符串之前。然后,reverse=True 纠正了这一点。

-- 例如:

fruits = ["blueberry", "peach", "applepine", "orange", "pear", "coconut", "lemon"]
sort_key = lambda f: ( len(f)<=5, f )
sorted(fruits, key = sort_key, reverse = True)
=> ['pear', 'peach', 'lemon', 'orange', 'coconut', 'blueberry', 'applepine']

【讨论】:

  • @DSM,你能解释一下原因吗?似乎正在研究提供的示例
  • 不知何故,我尝试过的一个测试用例一直给出错误的答案,现在我无法重现它,所以它可能是 PEBKAC。 :-)
  • 我没想到,这很聪明。我不确定它是否适用于所有情况(例如,一个包含三个字符串的元组的列表要正常排序或交替反转),但它在我给出的简单示例中效果很好,谢谢。
【解决方案2】:

您可以通过拆分任何短于 5 个字符的内容,对每个部分进行排序,然后将它们组合成一个列表来进行一种合并排序。

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2016-10-04
    • 2017-01-09
    • 1970-01-01
    • 2017-08-11
    • 2019-09-15
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多