【问题标题】:How do I implement a Schwartzian Transform in Python?如何在 Python 中实现 Schwartzian 变换?
【发布时间】:2017-06-25 19:40:08
【问题描述】:

在 Perl 中,我有时使用 Schwartzian Transform 来有效地对复杂数组进行排序:

@sorted = map  { $_->[0] }  # sort by word length
          sort { $a->[1] <=> $b->[1] } # use numeric comparison
          map  { [$_, length($_)] }    # calculate the length of the string
               @unsorted;

如何在 Python 中实现这种转换?

【问题讨论】:

  • 在 Python 中不需要它,只需为排序函数提供适当的 key 函数
  • 您可能在 Perl 中也不需要它。大多数时候,我看到使用变换是为了让作者觉得很聪明。始终在优化代码之前对其进行分析。
  • Perl:或者使用 Sort::Key 系列模块来获得一个简单的界面。

标签: python perl sorting


【解决方案1】:

你不需要。 Python 内置了这个功能,实际上 Python 3 删除了 C 风格的自定义比较,因为这在绝大多数情况下要好得多。

按字长排序:

unsorted.sort(key=lambda item: len(item))

或者,因为len 已经是一元函数:

unsorted.sort(key=len)

这也适用于内置的sorted 函数。

如果您想根据多个条件进行排序,您可以利用元组按字典顺序排序的事实:

# sort by word length, then alphabetically in case of a tie
unsorted.sort(key=lambda item: (len(item), item)))

【讨论】:

  • 我在文档中看到该函数每个元素调用一次。这是否意味着python使用额外的数据结构将键映射到函数的结果?
  • @planetp 它必须,是的,虽然确切的细节与 python-land 无关 :) 我相信它只是一个临时的并行 c 数组
  • @ikegami "列表中每一项对应的key计算一次,然后用于整个排序过程。"
  • 如果您需要按多个条件进行排序,其中一些条件颠倒(降序与升序),this is how
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2012-03-24
  • 2021-02-09
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多