当前位置:  开发笔记 > 编程语言 > 正文

使用cmp在Python中排序()

如何解决《使用cmp在Python中排序()》经验,为你挑选了1个好方法。

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

我看到有人在一行编码

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

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

有谁能告诉我?谢谢.



1> kay..:

前言:

根据正常比较对列表进行排序:

some_list.sort()   

提供定制比较器:

some_list.sort(cmp=my_comparator)

一个lambda函数:

x = lambda a, b: a - b
# is roughly the same as
def x(a, b):
    return a - b

一个if-else表达式:

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()是稳定的,这个代码是没有理智的,因为比较需要测试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)

但请注意:

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

不过,差异可能只对很长的列表有意义.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有