替代方法:使用“键功能”按两个参数对列表进行排序

马克斯·梅

目标:

  • 通过带有两个功能A,B的“键功能”排序列表
  • 开始使用功能A进行排序
  • 对于每个具有相同A(element)值的元素,请按B(element)排序这些元素

问题:

  • 函数A快速高效(可能发生重复!)
  • 函数B非常慢,但要确保没有重复发生
  • sorted(List, key=lambda element: (A(element), B(element))) 总是按A和B排序,导致性能降低。

恳求:

  • 请按正确的方向轻推我。

感谢每一个答案

切普纳

这是旧cmp关键字更有用的情况。在Python 2中,您将编写类似

sorted(List, cmp=lambda x, y: cmp(A(x), A(y)) or cmp(B(x), B(y)))

B(x)并且B(y)只有在cmp(A(x), A(y))返回0时才被调用,指示A(x) == A(y)

Python 3摆脱了cmp关键字参数sorted以及内置函数cmp,因此您需要首先重新实现cmp,然后使用functools.cmp_to_key来定义一个等效key函数。

from functools import cmp_to_key


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


sorted(List, key=cmp_to_key(lambda x,y: cmp(A(x), A(y)) or cmp(B(x), B(y))))

由于我们还是从头开始编写,因此您可以通过折叠AB将其定义cmp简化一下cmp

def cmp_with(f, x, y):
    fx = f(x)
    fy = f(y)
    if fx < fy:
        return -1
    elif fx > fy:
        return 1
    else:
        return 0

sorted(List, key=cmp_to_key(lambda x, y: cmp_with(A, x, y) or cmp_with(B, x, y))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章