【问题标题】:What is the right Python idiom for sorting by a single criterion (field or key)? [closed]按单个标准(字段或键)排序的正确 Python 习惯用法是什么? [关闭]
【发布时间】:2016-04-24 05:50:15
【问题描述】:

如标题所示,如何按单一标准对对象进行排序?

我听说过 key 参数、cmp 参数和 Decorate-Sort-Undecorate 模式。
我应该在现代 Python 中使用哪一个,以及如何使用?

【问题讨论】:

  • 请注意,即使是自我回答的问题也应符合网站的质量要求;见How to Ask“如何” 问题不适合 SO,请考虑将其写在博客或其他地方。
  • @jonrsharpe:目前,我真的不知道如何改进这个问题,同时保持它不区分大小写;我明天再考虑一下。 在博客上写这篇文章是什么意思? (英语不是我的母语)
  • 我的意思是把这篇文章作为一篇文章发布到博客上,而不是试图把它硬塞到 SO 上。
  • 我将标题编辑得更具体,并投票决定重新开放

标签: python sorting key idioms


【解决方案1】:

在现代 Python 中,最好的方法是使用 list.sortsortedkey 参数。

当您传递 key 参数时,排序函数会比较 key 为它们返回的任何内容,而不是直接比较元素。

因此,您可以将任何将元素排序为单个位置参数的可调用对象作为key 传递,并返回该元素的排序依据。
每个元素都会调用一次可调用对象。

一些简单的例子:

   list_ = ['B', 'aaa', 'CC']

   sorted(list_)
=> ['B', 'CC', 'aaa']

   # case-insensitive sorting
   sorted(list_, key=str.lower)
=> ['aaa', 'B', 'CC']

   # sorting by length
   sorted(list_, key=len)
=> ['B', 'CC', 'aaa']

key排序大致相当于Decorate-Sort-Undecorate pattern

def decorate_sort_undecorate(iterable, key):
    # 1: decorate:
    decorated = [(key(elem), index, elem) for index, elem in enumerate(iterable)]

    # 2: sort:
    decorated.sort()

    # 3: undecorate: 
    return [elem for key_, index, elem in decorated]

这将创建 3 元素元组的临时列表 (decorated),
形式为:(key_, index, elem),其中key_ = key(elem)。然后,decorated 列表被排序。
元组通过第一个不相等的元素进行比较。这是key_,或者如果key_s 相等,则index。因为没有相等的索引,所以从不直接比较元素。
最后将decorated中的元素提取到新列表中,并返回。

随意的想法:

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2017-08-13
    • 2010-09-19
    • 2013-10-22
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多