在 Python 中对字母数值进行排序

sorting alpha numeric values in Python

提问人:darklord84 提问时间:1/28/2022 最后编辑:darklord84 更新时间:1/28/2022 访问量:53

问:

我有一个不同用户的字典条目,如下所示:

{'usr_1': '111', 'usr_2': '222','usr_22' : '3333', 
 'usr_8': '888','usr_11':'11111','usr_10':'10101'}

我想根据键对这本字典进行排序。输出应为

{'usr_1': '111', 'usr_2': '222','usr_8': '888',
'usr_10':'10101', 'usr_11':'11111','usr_22' : '3333'}

当我尝试使用 OrderedDict 方法时,它只是返回将列表更改为元组,并且没有给我想要的排序顺序。

dict1 = {'usr_1': '111', 'usr_2': '222','usr_22' : '3333', 
         'usr_8': '888','usr_11':'11111','usr_10':'10101'}

my_dict = OrderedDict(dict1)
print(my_dict)

输出

OrderedDict([('usr_1', '111'), ('usr_2', '222'), ('usr_22', '3333'),
             ('usr_8', '888'), ('usr_11', '11111'), ('usr_10', '10101')])

有人可以帮我吗?

Python 排序 字典

评论

1赞 Mark Ransom 1/28/2022
搜索“自然排序”,这应该对您有所帮助。
0赞 Olvin Roght 1/28/2022
dict(sorted(dict1.items(), key=lambda x: int(x[0].split("_", 1)[1])))
0赞 Mark Ransom 1/28/2022
哦,按插入顺序排序,而不是按键排序。OrderedDict
0赞 Kelly Bundy 1/28/2022
@MarkRansom我根本不会称之为“排序”,而是“保持”插入顺序。甚至这不是正确的,因为它的方法允许您在不进行插入的情况下更改顺序。move_to_end
0赞 Tim Roberts 1/28/2022
以我的拙见,依赖字典的任何特定顺序都是不好的做法。它类似于 SQL 数据库,其中的记录不排序。您不需要按任何特定顺序存储记录。这在操作上没有区别,只会增加开销。您需要的是按特定顺序访问它们。这可以通过对键进行排序并在需要访问它们时遍历该排序的结果来完成。.for i in sorted(dct.keys(), compare=xxx):

答:

1赞 user7864386 1/28/2022 #1

使用在“_”上拆分的 lambda 作为键:

out = dict(sorted(dct.items(), key=lambda x: int(x[0].split('_')[1])))

输出:

{'usr_1': '111',
 'usr_2': '222',
 'usr_8': '888',
 'usr_10': '10101',
 'usr_11': '11111',
 'usr_22': '3333'}

评论

2赞 Olvin Roght 1/28/2022
可能的替代方案是dict(sorted(dict1.items(), key=lambda x: x[0][x[0].find("_") + 1:].zfill(3)))
4赞 Alain T. 1/28/2022 #2

为了以数字方式对包含数字的字符串进行排序,可以将它们右对齐为通用的最大长度:

dict(sorted(dict1.items(),key="{0[0]:>20}".format))

输出:

{'usr_1': '111', 'usr_2': '222', 'usr_8': '888', 'usr_10': '10101', 
 'usr_11': '11111', 'usr_22': '3333'}

请注意,仅当前缀字符小于“0”(恰好是“_”)时,这才有效。如果没有,则需要拆分字符串或转换字符。(如果有不同长度的非数字前缀,也是如此)

评论

1赞 Kelly Bundy 1/28/2022
我想这是最小的“可打印”字符是一件好事:-)' '