Python中使用cmp进行排序()

9

我想要对列表进行排序,将所有的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)

但是我不理解括号里面的意思。

有人可以告诉我吗?谢谢。


2
你对这些了解多少,不了解多少?你知道 cmp 参数是干什么的吗?你知道什么是 lambda 吗?你知道内联的 if..else 是什么吗? - deceze
尝试使用谷歌搜索您的标签:pythonlambdasort,您会发现它们的用法和功能。 - linluk
1
即使你知道Python,你可能会忽略这行代码依赖于比较项的顺序这一实现细节,因此我认为这个问题是相关的。 - Kijewski
3个回答

17

前言:

根据普通的比较方法对列表进行排序:排序

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()稳定的,但这段代码不合理,因为比较器需要测试ab。一个正确的实现应该使用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)))

然而,这种差异可能只在相当长的列表中才会有所影响。


0
>>> 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']

-1

你应该自问自答,这是制定学习行动计划的方案:


三元表达式的描述在这里:

https://docs.python.org/3/reference/expressions.html?highlight=ternary%20operator#conditional-expressions

在那份文件中,你可以找到很多表达式的描述:

https://docs.python.org/3/reference/expressions.html


问:lambda是什么意思?

请花费5天的时间阅读有关Python语言的教程,这是原始Gvinno Van Rossum书籍的分支。

https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接