使用cmp在Python中排序()

时间:2015-12-08 15:15:48

标签: python sorting lambda cmp

我正在尝试对列表进行排序,将所有0移到列表末尾。 例如:[0,1,0,2,3,0,4] - > [1,2,3,4,0,0,0]

我看到有人用1行编码

list.sort(cmp=lambda a,b:-1 if b==0 else 0)

但我不明白括号内的意思。

有人能告诉我吗?谢谢。

2 个答案:

答案 0 :(得分:11)

前言

Sort a list根据正常comparison

some_list.sort()   

提供custom comparator

some_list.sort(cmp=my_comparator)

A 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)))

但差异可能只对很长的名单很重要。

答案 1 :(得分:-1)

>>> sorted(l, key=lambda x:str(x) if x == 0 else x)
[1, 3, 4, 8, 0, 0, 0]

猜猜这里发生了什么?我正在利用这样一个事实,作为一个偏好,python将首先获取整数,然后是字符串。所以我将0转换为' 0'。

这是证明。

>>> ll = [3,2,3, '1', '3', '0']
>>> sorted(ll)
[2, 3, 3, '0', '1', '3']