在python中按字母数字排序列表

时间:2013-11-06 20:16:22

标签: python python-2.7

我是python的新手,我正在尝试对列表字母数字进行排序。

我在这里看到了其他答案并试图自己解决,但可以解决这个问题!

假设我有这个清单:

showslist = ("Atest 2", "Atest 4", "Atest 1", "Atest 9", "Atest 10", "Btest 11", "Btest 6", "Ctest 3")

sortfiles = sorted(showslist, key=lambda item: (int(item.partition(' ')[0])
                                   if item[0].isdigit() else float('inf'), item))
for i in sortfiles:
    print i

返回:

Atest 1 Atest 10 Atest 2 Atest 4 Atest 9 Btest 11 Btest 6 Ctest 3

并且应该返回:

Atest 1 Atest 2 Atest 4 Atest 9 Atest 10 Btest 6 Btest 11 Ctest 3

任何人都可以帮我解决这个问题 非常感谢提前。

1 个答案:

答案 0 :(得分:0)

在空格上拆分项目,取下半部分,将其转换为整数,然后使用它进行排序。

>>> showslist = ("test 2", "test 4", "test 1", "test 9", "test 10", "test 11", "test 6", "test 3")
>>> sorted(showslist, key=lambda item: int(item.split()[1]))
['test 1', 'test 2', 'test 3', 'test 4', 'test 6', 'test 9', 'test 10', 'test 11']

partition也可以,但你正在访问返回值(“test”)的第0个元素,而不是第二个(数字。)

>>> sorted(showslist, key=lambda item: int(item.partition(' ')[2]))
['test 1', 'test 2', 'test 3', 'test 4', 'test 6', 'test 9', 'test 10', 'test 11']

看起来你的最终条件是试图确保字符串有一个数字组件,这是一个好主意,虽然检查item的第0个字符是一个数字对你不会有多大帮助这里很好,因为你所展示的所有项目都是“t”。

>>> showslist = ("test 2", "test 4", "oops no number here", "test 3")
>>> sorted(showslist, key=lambda item: int(item.partition(' ')[2]) if ' ' in item and item.partition(' ')[2].isdigit() else float('inf'))
['test 2', 'test 3', 'test 4', 'oops no number here']

如果你想先按文本组件排序,然后再按数字组件排序,你可以编写一个函数来获取一个项目并返回一个(文本,数字)元组,Python将按你想要的方式排序。

def getValue(x):
    a,_,b = x.partition(" ")
    if not b.isdigit():
        return (float("inf"), x)
    return (a, int(b))

showslist = ("Atest 2", "Atest 4", "Atest 1", "Atest 9", "Atest 10", "Btest 11", "Btest 6", "Ctest 3")
print sorted(showslist, key=getValue)
#result: ['Atest 1', 'Atest 2', 'Atest 4', 'Atest 9', 'Atest 10', 'Btest 6', 'Btest 11', 'Ctest 3']

这可以在一行中完成,尽管您在可读性方面的损失远远超过文件大小:

print sorted(showslist, key= lambda x: (lambda a, _, b: (a, int(b)) if b.isdigit() else (float("inf"), x))(*x.partition(" ")))