python - 带有键实现的 Python 排序
问题描述
我正在尝试使用 key 进行 python 排序。我对算法的内部工作感兴趣。它是否大致相当于 Schwartzian 变换(Decorate-Sort-Undecorate)?
具体来说:
- 规范键只提取一次。是否可以假设这发生在任何比较发生之前?
- 提取的密钥如何保存在内存中?作为元组
(key, orginal_value)
还是使用其他方法。
我使用了以下测试程序
class Isbn:
def __init__(self, isbn_num):
self.isbn_num = isbn_num
def __lt__(self, other):
print(f"__lt__ {self.isbn_num} {other.isbn_num}")
return self.isbn_num < other.isbn_num
def __repr__(self) -> str:
return f'Isbn({self.isbn_num})'
class Book:
def __init__(self, isbn):
self.isbn = Isbn(isbn)
def __repr__(self) -> str:
return f'Book({self.isbn})'
@property
def key(self):
print(f"key {self.isbn}")
return self.isbn
books = [Book(5), Book(10), Book(6), Book(2)]
books.sort(key=lambda b: b.key)
print(books)
这给出了以下输出:
key Isbn(5)
key Isbn(10)
key Isbn(6)
key Isbn(2)
__lt__ 10 5
__lt__ 6 10
__lt__ 6 10
__lt__ 6 5
__lt__ 2 6
__lt__ 2 5
[Book(Isbn(2)), Book(Isbn(5)), Book(Isbn(6)), Book(Isbn(10))]
解决方案
是的,PythonSchwartzian transform
在某些情况下确实使用了。从这个文档。
Python 程序员在比较操作可能很昂贵的地方使用转换。
推荐阅读
- sql - 这怎么能翻译成postgresql?
- r - R - 将一列分成两个相关的
- bash - 如何读取 JIRA REST API 的响应
- telerik - 如何在客户端更新/设置 Telerik RadMaskedTextBox 的掩码(使用 javascript / jquery)
- flask-socketio - FlaskSocketIO 检索所有已连接客户端的列表
- r - 尝试用相同的键替换 aa 列的 na 值,但其中一行有值
- c++ - MPI 和移动语义
- python - 使用 Colab 笔记本在我们的谷歌驱动器中获取文件的可共享链接
- python - Argparse:具有可变参数的选项的可选参数
- python - Python中路径中的空格