前言:
Sort a list按照正常的comparison:
some_list.sort()
提供custom comparator:
some_list.sort(cmp=my_comparator)
lambda function:
x = lambda a, b: a - b
# is roughly the same as
def x(a, b):
return a - b
if-else-expression:
value = truthy_case if condition else otherwise
# is roughly the same as
if condition:
value = truthy_case
else:
value = otherwise
list.sort(cmp=lambda a,b:-1 if b==0 else 0) 行本身:
现在,比较器中的条件是b==0,如果是则表明b的值大于a(结果的符号为负),否则表明值比较相同(符号为零)。
虽然 Python 的 list.sort() 是 stable,但 这段代码并不健全,因为比较器也需要测试 a,而不仅仅是 b。正确的实现将使用 key 参数:
some_list.sort(key=lambda a: 0 if a == 0 else -1)
修复list.sort(cmp=...) 实现:
如果你想使用list.sort(cmp=...)(你不想)或者你只是好奇,这是一个理智的实现:
some_list.sort(cmp=lambda a, b: 0 if a == b else
+1 if a == 0 else
-1 if b == 0 else 0)
But notice:
在 Py3.0 中,cmp 参数被完全删除(作为简化和统一语言的更大努力的一部分,消除了丰富的比较和__cmp__ 方法之间的冲突)。
另一种选择:
排序列表位于O(? log ?)。我不知道对于这个简单的问题,代码是否运行得更快,但我不这么认为。 O(?) 解决方案正在过滤:
new_list = [x for x in some_list if x != 0]
new_list.extend([0] * (len(some_list) - len(new_list)))
不过,这种差异可能只对很长的列表很重要。