如何在python中编写复杂的排序?

And*_*sby 4 python

有没有一种简洁的方法来对列表进行排序,首先按升序对数字进行排序,然后按降序对字符进行排序?

您将如何排序以下内容:

['2', '4', '1', '6', '7', '4', '2', 'K', 'A', 'Z', 'B', 'W']

到:

['1', '2', '2', '4', '4', '6', '7', 'Z', 'W', 'K', 'B', 'A']

Jan*_*Jan 12

一种方法(可能有更好的方法)是事先将数字和字母分开,适当地对它们进行排序,最后再将它们粘在一起:

lst = ['2', '4', '1', '6', '7', '4', '2', 'K', 'A', 'Z', 'B', 'W']

numbers = sorted([number for number in lst if number.isdigit()])
letters = sorted([letter for letter in lst if not letter.isdigit()], reverse=True)
combined = numbers + letters
print(combined)
Run Code Online (Sandbox Code Playgroud)

另一种方法是利用ord(...)元组进行排序。这里我们用 0 表示数字,1 表示字母:

def sorter(item):
    if item.isdigit():
        return 0, int(item)
    else:
        return 1, -ord(item)

print(sorted(lst, key=sorter))
Run Code Online (Sandbox Code Playgroud)

两者都会产生

['1', '2', '2', '4', '4', '6', '7', 'Z', 'W', 'K', 'B', 'A']
Run Code Online (Sandbox Code Playgroud)

至于时间:

def different_lists():
    global my_list
    numbers = sorted([number for number in my_list if number.isdigit()])
    letters = sorted([letter for letter in my_list if not letter.isdigit()], reverse=True)
    return numbers + letters

def key_function():
    global my_list
    def sorter(item):
        if item.isdigit():
            return 0, int(item)
        else:
            return 1, -ord(item)

    return sorted(my_list, key=sorter)

from timeit import timeit
print(timeit(different_lists, number=10**6))
print(timeit(key_function, number=10**6))
Run Code Online (Sandbox Code Playgroud)

这会产生(在我的 MacBook 上运行一百万次):

2.9208732349999997
4.54283629
Run Code Online (Sandbox Code Playgroud)

所以这里使用列表推导式的方法更快。