key 参数(和lambda)并不意味着修改list 的内容。相反,它用于根据每个元素在应用key 函数时的评估方式进行排序。
但是,您可以通过在 key 的函数参数上调用 .sort() 来使用 key 的副作用来实现您的目标。由于.sort() 结果只是None,因此您还需要提供参数本身以用于实际排序:
l = [[3,4],[1,2],[2,1],[6,5]]
l.sort(key=lambda x: (x.sort(), x))
print(l)
# [[1, 2], [1, 2], [3, 4], [5, 6]]
不过,这并不是一种好的编程习惯。
一种更清洁、更高效但显然不是单行的方法是:
l = [[3,4],[1,2],[2,1],[6,5]]
for x in l:
x.sort()
l.sort()
print(l)
# [[1, 2], [1, 2], [3, 4], [5, 6]]
基于key 的方法效率也显着降低,因为它尝试在每个key 调用中对内部列表进行排序,我们应该期望在n log n 次调用中对内部列表进行排序,而不是严格要求的n 次调用,因此一些内部列表不可避免地被排序超过必要。相反,遍历外部列表显式地对每个内部列表进行一次排序。
只是给出一些时间的想法:
import random
import copy
import collections
def double_sort_loop(seq):
for x in seq:
x.sort()
seq.sort()
def double_sort_deque(seq):
collections.deque(map(lambda x: x.sort(), seq), maxlen=0)
seq.sort()
def double_sort_key(seq):
seq.sort(key=lambda x: (x.sort(), x))
def gen_input(n, m, v_min=None, v_max=None):
if v_min is None:
v_min = 0
if v_max is None:
v_max = v_min + (2 * m * n)
return [[random.randint(v_min, v_max) for _ in range(m)] for _ in range(n)]
random.seed(0)
base = gen_input(100000, 10)
%timeit seq = copy.deepcopy(base); double_sort_loop(seq)
# 1 loop, best of 3: 1.03 s per loop
%timeit seq = copy.deepcopy(base); double_sort_deque(seq)
# 1 loop, best of 3: 1.02 s per loop
%timeit seq = copy.deepcopy(base); double_sort_key(seq)
# 1 loop, best of 3: 1.19 s per loop
(已编辑)