有没有一种简洁的方法来对列表进行排序,首先按升序对数字进行排序,然后按降序对字符进行排序?
您将如何排序以下内容:
['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)
所以这里使用列表推导式的方法更快。