【问题标题】:python implementation of c++ sortc++排序的python实现
【发布时间】:2020-03-17 22:23:05
【问题描述】:
    struct node {
        int L, R, i;
    }q[N];

    bool cmp(node x, node y) {
        if(x.L/BLOCK != y.L/BLOCK) {
            // different blocks, so sort by block.
            return x.L/BLOCK < y.L/BLOCK;
        }
        // same block, so sort by R value
        return x.R < y.R;
    }
sort(q, q + m, cmp);

其中 m 是 q 数组的大小。我想知道如何在 python 中实现上述 c++ 代码,即基于函数作为第三个参数进行比较。

【问题讨论】:

标签: python


【解决方案1】:

您正在使用结构 q 来表示一些数据。我将假设您已经在 python 中创建了所需类型的对象:

class Q: 
  def __init__(self, L, R, i):
    self.L = L
    self.R = R
    self.i = i

我还将假设您已经定义了BLOCK,并且它是一个常量。

因此,假设您有一个 q 类型的对象 Q 的列表,您可以通过以下方式对该列表进行排序

q.sort(lambda x: (x.L/BLOCK, x.R))

也就是说,使用 lambda 函数调用 sort(),该函数返回 q 的任何给定元素的 2 元组。当 python 中的排序键返回一个元组时,排序会基于该元组按优先级顺序进行 - 如果x.L/BLOCK 相等,那么它才会继续使用x.R 进行比较。

list.sort() 和内置函数 sorted() 都采用一个可选参数,即函数/lambda“键”。对于任何给定元素,此键输出排序标准 - 类似于 C++ 中 std::sort 的第三个参数,不同之处在于它使用键函数而不是比较器。不过,在这种情况下,它也同样有效。

【讨论】:

  • 不过,很可能应该是//
【解决方案2】:

从 3.0 开始,Python 不再支持在其内置排序中使用 cmp 函数,只支持将值映射到可比较键的 key 函数。

以前,您会使用:

def cmp(x, y):
    if (x > y):
        return 1
    elif (x < y):
        return -1
    else:
        return 0

sorted([1,3,5,2,4,6], cmp=cmp)

如果您没有可用的key 函数,而只有cmp 函数,则Python 在functools 模块中有一个适配器函数:

from functools import cmp_to_key

def cmp(x, y):
    if (x > y):
        return 1
    elif (x < y):
        return -1
    else:
        return 0

sorted([1,3,5,2,4,6], key=cmp_to_key(cmp)

【讨论】:

  • 谢谢,mo算法是我最大的麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2010-11-19
  • 2011-03-29
  • 2017-02-18
  • 2014-04-21
  • 1970-01-01
相关资源
最近更新 更多