首页 > 解决方案 > Python 排序的 lambda 函数返回一个布尔值

问题描述

所以,我有一个名称列表,我正在尝试对列表进行排序,以便以元音开头的名称首先位于列表中,然后那些不以元音开头的名称然后位于它们之后并且按字母顺序排序。

为此,我编写了以下代码,但是结果不是我所期望的:

a = ["anna", "ollie", "tim", "bob", "trevor", "susan"]
print(sorted(a, key=lambda x: (x[0] in 'aeiou', x)))

结果:

['bob', 'susan', 'tim', 'trevor', 'anna', 'ollie']

我认为根据我的代码,名称:“anna”和“ollie”应该首先定位,然后是其余的名称,因为这两个名称将在我的 lambda 函数的第一部分返回 true。

如果有人能解释为什么我会得到这个结果以及我需要做什么来获得我想要的结果,我将不胜感激。

谢谢!!

标签: pythonsortinglambda

解决方案


原因是:

x[0] in 'aeiou' 

返回 1(或 True),['anna', 'ollie']其余返回 0(或 False)。所以 0 < 1,因此是输出。

改为这样做:

print(sorted(a, key=lambda x: (x[0] not in 'aeiou', x)))

输出

['anna', 'ollie', 'bob', 'susan', 'tim', 'trevor']

有关比较的解释,请查看文档,以下引用来自那里:

元组和列表使用对应元素的比较按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同的类型并且具有相同的长度。

同样对于我建议的布尔值的行为,以下链接引用:

布尔值是两个常量对象 False 和 True。它们用于表示真值(尽管其他值也可以被认为是假或真)。在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别类似于整数 0 和 1。


推荐阅读