为了账号安全,请及时绑定邮箱和手机立即绑定

按字母数字顺序按属性对对象列表进行排序

按字母数字顺序按属性对对象列表进行排序

慕尼黑的夜晚无繁华 2021-03-27 11:07:28
我有一个相同类型的对象列表lis = [<obj>, <obj>, <obj>]我希望根据object属性自然排序name。我试过了sortedlist = sorted(lis, key=lambda x: x.name)但这将列表排序为A1A10A2不是我想要的格式A1A2A10我曾尝试通过对字母数字字符串进行排序来修改代码,但无法使它适用于对象列表。
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

sorted(obj, key=lambda x: (x.name[0], int(x.name[1:])))


查看完整回答
反对 回复 2021-03-30
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

这种方式使用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']


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信