python - 按属性字母数字排序对象列表

标签 python sorting

我有一个相同类型的对象列表

lis = [<obj>, <obj>, <obj>]

我希望按对象属性 name 自然排序。我试过了

sortedlist = sorted(lis, key=lambda x: x.name)

但是这会将列表排序为

A1
A10
A2

不是我想要的格式

A1
A2
A10

我尝试修改 sorting alphanumeric strings 中的代码,但我无法让它为对象列表工作。

最佳答案

这种方式使用 groupby,并适用于字母和数字之间的任意数量的交换

from itertools import groupby
def keyfunc(s):
    return [int(''.join(g)) if k else ''.join(g) for k, g in groupby(s, str.isdigit)]

sorted(my_list, key=keyfunc)

演示:

>>> my_list =['A1', 'A10', 'A2', 'B0', 'AA11', 'AB10']
>>> sorted(my_list, key=keyfunc)
['A1', 'A2', 'A10', 'AA11', 'AB10', 'B0']

>>> mylist =['foo1', 'foo10', 'foo2', 'foo2bar1', 'foo2bar10', 'foo2bar3']
>>> sorted(mylist, key=keyfunc)
['foo1', 'foo2', 'foo2bar1', 'foo2bar3', 'foo2bar10', 'foo10']

关于python - 按属性字母数字排序对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955105/

相关文章:

python - Pyephem: 'Titan' 对象没有属性 'mag'

c++ - 使用迭代器的自定义比较器函数

c# - 使用一个 TKey 数组对多个 TValue 数组进行排序

python - Multiindex 中的 Pandas 自定义排序行

python - Python的max函数有多高效

python - 当存在重复项时查找列表之间的差异

c - 调试错误选择排序

SQL升序排序时如何让空值排在最后

Python:从图像转换矩阵是 3D 而不是 2D

Python程序启动