python - 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。
如果有人能解释为什么我会得到这个结果以及我需要做什么来获得我想要的结果,我将不胜感激。
谢谢!!
解决方案
原因是:
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。
推荐阅读
- ios - 未捕获的异常 'NSGenericException: 应用程序提供了一个 UIAlertController 样式的 UIAlertControllerStyleActionSheet
- postgresql - 出现错误“查询没有结果数据的目的地”
- json - 如何将此嵌套的 json 带入类
- php - json_encode() 问题和存储在 PHP 中的 cookie 问题
- sql - 使用带有左连接的合并来使用最新数据填充主表
- php - Magento 2 Checkout Billing Step Error 'Shipping Address is not set'
- javascript - 验证数据然后返回解析?
- numpy - numpy 掩码覆盖另一个掩码
- c# - Azure 耐用功能。编排产生了许多不需要的活动
- c# - MVC 身份 cookie 跨子域进行身份验证