首页 > 解决方案 > 带有键实现的 Python 排序

问题描述

我正在尝试使用 key 进行 python 排序。我对算法的内部工作感兴趣。它是否大致相当于 Schwartzian 变换(Decorate-Sort-Undecorate)

具体来说:

我使用了以下测试程序

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))]

标签: pythonsorting

解决方案


是的,PythonSchwartzian transform在某些情况下确实使用了。从这个文档

Python 程序员在比较操作可能很昂贵的地方使用转换。


推荐阅读