【问题标题】:sort() in Python using cmp使用 cmp 在 Python 中排序()
【发布时间】:2015-12-08 15:15:48
【问题描述】:

我正在尝试对列表进行排序,将所有 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)

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

谁能告诉我?谢谢。

【问题讨论】:

  • 你懂多少,不懂多少?你知道cmp 参数的作用吗?你知道lambda 是什么吗?你知道内联if..else 是什么吗?
  • 尝试在谷歌上搜索您的标签:pythonlambdasort,您会发现如何使用它们以及它们的作用。
  • 即使您了解 Python,您也可能会错过这样一个事实,即这一行依赖于关于项目比较顺序的实现细节,所以我确实认为问题是主题。

标签: python sorting lambda cmp


【解决方案1】:

前言:

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

不过,这种差异可能只对很长的列表很重要。

【讨论】:

    【解决方案2】:
    >>> 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']
    

    【讨论】:

      【解决方案3】:

      你应该自己回答,这是计划:


      这里有三元表达式描述:

      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

      【讨论】:

        猜你喜欢
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        相关资源
        最近更新 更多