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

如何对python中设置的字母数字进行排序

如何对python中设置的字母数字进行排序

冉冉说 2019-11-12 09:27:58
我有一套set(['booklet', '4 sheets', '48 sheets', '12 sheets'])排序后,我希望它看起来像4 sheets,12 sheets,48 sheets,booklet有什么想法吗
查看完整描述

3 回答

?
largeQ

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

简短而甜美:


sorted(data, key=lambda item: (int(item.partition(' ')[0])

                               if item[0].isdigit() else float('inf'), item))

这个版本:


适用于Python 2和Python 3,因为:

它不假定您比较字符串和整数(在Python 3中不起作用)

它不使用cmp参数sorted(Python 3中不存在)

如果数量相等,将按字符串部分排序

如果要完全按照示例中的说明打印输出,则:


data = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])

r = sorted(data, key=lambda item: (int(item.partition(' ')[0])

                                   if item[0].isdigit() else float('inf'), item))

print ',\n'.join(r)


查看完整回答
反对 回复 2019-11-12
?
慕沐林林

TA贡献2016条经验 获得超9个赞

Jeff Atwood讨论了自然排序,并举例说明了使用Python进行排序的一种方法。这是我的变化形式:


import re 


def sorted_nicely( l ): 

    """ Sort the given iterable in the way that humans expect.""" 

    convert = lambda text: int(text) if text.isdigit() else text 

    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 

    return sorted(l, key = alphanum_key)

像这样使用:


s = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])

for x in sorted_nicely(s):

    print(x)

输出:


4 sheets

12 sheets

48 sheets

booklet

此方法的一个优点是,当字符串之间用空格分隔时,该方法不仅有用。它也适用于其他分隔符,例如版本号中的句点(例如1.9.1在1.10.0之前)。


查看完整回答
反对 回复 2019-11-12
?
慕桂英3389331

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

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_set = {'booklet', '4 sheets', '48 sheets', '12 sheets'}

>>> sorted(my_set, key=keyfunc)

['4 sheets', '12 sheets', '48 sheets', 'booklet']

对于Python3,有必要对其进行一些修改(此版本在Python2中也可以正常使用)


def keyfunc(s):

    return [int(''.join(g)) if k else ''.join(g) for k, g in groupby('\0'+s, str.isdigit)]


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 1382 浏览
慕课专栏
更多

添加回答

举报

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