这是关于
sorted()
内置函数的简介,它可以从可迭代对象中构建一个新的排序列表。
sorted()
函数具有 key 参数,用于指定在进行比较之前对每个列表元素调用的函数。
key 参数的值应该是一个函数,它接受一个参数并返回一个用于排序目的的键(在这种特殊情况下是元组)。这种技术很快,因为 key 函数对每个输入记录仅被调用一次。
让我们将
sorted
函数拆分成更易读的代码块。
def key_function(character):
print((character.isdigit() - character.islower(), character in "02468", character))
return (character.isdigit() - character.islower(), character in "02468", character)
input_string = "1949 Film Prejudice"
print(*sorted(input_string, key=key_function), sep="")
这是我为了解释问题而构造的元组中间列表。
[
(1, False, "1"),
(1, False, "9"),
(1, True, "4"),
(1, False, "9"),
(0, False, " "),
(0, False, "F"),
(-1, False, "i"),
(-1, False, "l"),
(-1, False, "m"),
(0, False, " "),
(0, False, "P"),
(-1, False, "r"),
(-1, False, "e"),
(-1, False, "j"),
(-1, False, "u"),
(-1, False, "d"),
(-1, False, "i"),
(-1, False, "c"),
(-1, False, "e"),
]
这些元组之间的比较是理解其工作原理的关键。
如果您只是对这个使用元组比较进行排序的列表进行排序,您将得到所需的结果。
我们将介绍在
(1, False, "1") > (1, False, "9")
期间发生的3个比较方面:
- 整数比较
- 布尔比较
- 字符比较
整数比较
整数比较直观,因为我们只需要处理整数。
布尔比较
只是为了展示True曾经是False的内容
PEP 285
(True和False常量在Python 2.2.1中添加到内置函数中,但2.2.1版本仅设置为1和0的整数值,并且不是不同的类型。)
所以它们之间的比较也与整数之间的比较相同。
True - False
的结果是
1
,
False - True
的结果是
-1
。
字符比较
这些字符串按照它们的字符的 ASCII 值排序(p 在 ASCII 中是 112,而 P 是 80)。
从技术上讲,Python 比较这些字符的 Unicode 代码点(也就是 ord 所做的),ASCII 字符的 Unicode 代码点恰好等于其 ASCII 值。
所以最终也归结为整数比较。
希望现在您已经对那个
sorted
函数中发生的事情有了很好的理解 :)
https://treyhunner.com/2019/03/python-deep-comparisons-and-code-readability/
int
的子类。如果你将True
视为1
,将False
视为0
,那么这句话应该更容易理解。 - Klaus D.