python - 使用 cmp 在 Python 中排序()

标签 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)

但是我不明白括号里面是什么意思。

谁能告诉我?谢谢。

最佳答案

前言:

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 :

In Py3.0, the cmp parameter was removed entirely (as part of a larger effort to simplify and unify the language, eliminating the conflict between rich comparisons and the __cmp__ methods).

替代方案:

列表排序在 O(𝘯 log 𝘯) 中。我不知道对于这个简单的问题代码是否运行得更快,但我不这么认为。 O(𝘯) 解决方案是过滤:

new_list = [x for x in some_list if x != 0]
new_list.extend([0] * (len(some_list) - len(new_list)))

不过,差异可能只对相当长的列表有影响。

关于python - 使用 cmp 在 Python 中排序(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159437/

相关文章:

javascript - 按日期值对 JSON 对象进行排序

python - 用 pythons 内置的 map 函数替换函数

python - 使用 NumPy 进行位破解

java - 您如何对动态语言进行更改,并找到所有将被该更改破坏的地方?

python - 有没有办法使用 ADO.Net 连接到数据 block ?

java - 如何在 jrxml 文件中使用 lambda 表达式?

c# - 在类的每个属性上调用方法的表达式

python - 在 pandas 中插入行,其中一列缺少 groupby 中的某些值

java - 根据 hashMap 值 [不是键] 对 HashMap 列表进行排序

python:根据种类对每个条目进行编号