python - 如何按字符串属性对对象列表进行排序并使用“键”参数?
问题描述
我想list
按一个属性对一些对象进行排序,但我也希望能够key
在进行排序时指定一个(这些属性的)。我见过这样的答案,它使用属性对对象进行排序,但我想允许除了(对于字符串)只是按字母顺序排序之外的其他排序逻辑。这是一个示例类和排序函数来说明我的意思:
class Pet:
def __init__(self, name):
self.name = name
def __repr__(self): # for readability
return 'Pet({})'.format(self.name)
def sort_pets(pets, reverse=False):
pets.sort(reverse=reverse, key=lambda x : x.name)
Pet
因此,使用此功能,我可以按对象列表对它们进行排序name
:
>>> pets = [Pet(i) for i in ['Dexter Lewis Cumberbatch', 'Alice', 'Bozo Bob', 'Cy']]
>>> sort_pets(pets)
>>> print(pets)
[Pet(Alice), Pet(Bozo Bob), Pet(Cy), Pet(Dexter Lewis Cumberbatch)]
我可以按字母顺序或按字母顺序反转(使用reverse
)。但我想选择用不同的逻辑(比如名字长度、空格数、最后一个字母等)对宠物(按名字)进行排序。我可以为 制作一个key
参数sort_pets
,但我不能将它传递给 的key
参数sort
,因为它已经被用于访问name
属性。有没有办法做到这一点?
解决方案
您可以通过在查找每个对象的属性时将key
参数 fromsort_pets
合并到函数中来做到这一点:lambda
def sort_pets(pets, reverse=False, key=None):
if key is None:
sortkey = lambda x : x.name
else:
sortkey = lambda x : key(x.name)
pets.sort(reverse=reverse, key=sortkey)
因此,当 akey
未传递给sort_pets
时,对象仅按其name
属性排序。如果通过了,则将该键应用于每个键name
以构建新的lambda
键功能。
现在您可以使用key
of对对象sort_pets
进行排序,Pet
就好像您只是在查看名称一样:
pets = [Pet(i) for i in ['Dexter Lewis Cumberbatch', 'Alice', 'Bozo Bob', 'Cy']]
print(sort_pets(pets)) #no additional sorting
print(sort_pets(pets, key=lambda x : len(x))) #sort by number of characters
print(sort_pets(pets, key=lambda x : len(x.split(' ')[0]))) #sort by length of first name
print(sort_pets(pets, key = lambda x : x[-1])) #sort by last character
输出:
[Pet(Alice), Pet(Bozo Bob), Pet(Cy), Pet(Dexter Lewis Cumberbatch)]
[Pet(Cy), Pet(Alice), Pet(Bozo Bob), Pet(Dexter Lewis Cumberbatch)]
[Pet(Cy), Pet(Bozo Bob), Pet(Alice), Pet(Dexter Lewis Cumberbatch)]
[Pet(Bozo Bob), Pet(Alice), Pet(Dexter Lewis Cumberbatch), Pet(Cy)]
推荐阅读
- c - 如何读取带有空白单元格的表单 CSV 文件(所有单元格都是字符串)
- html - Angular 5:选择列表选项文本的不同前景色
- ios - 在“过滤器”之后或通过查找“包含”的“firstIndex”从数组中快速删除项目
- javascript - 如何使用 Jquery 从元素中获取所有值并将其放入数组?
- python - 如何使用基于列中的值的工作表将数据框导出到 Excel
- laravel - Laravel 默认密码重置
- spring - = 预计之后
我在我的 Spring XML 配置中写了以下内容
<context: component-scan base-package="com.tea.one.beans"/>
但是我
'= expected'
在组件扫描后收到一条错误消息。我阅读了文档和几个站点,但无法弄清楚组件扫描后 = 应该是什么。- algorithm - 算法问题:最小分片移动
- mysql - MySQL:查询时“转义'!'”是什么意思
- php - 尝试激活一次性折扣代码