可以“种子”比较函数用于排序(...)

时间:2014-09-08 12:26:00

标签: python sorting sorted

修改

我的原始问题似乎有缺陷;正如KillianDS和jonrsharpe所指出的那样,keycmp混淆了。使用cpm和我的类callable按预期工作。

我接受了jonrsharpe的回答,因为它是“如何使用数据播种函数”的更正确答案。

原始问题

是否可以在将函数传递给Python的sorted(list, key=comp)函数之前使用数据预先设定种子?

我尝试过创建一个可调用的类,如下所示:

class MyComp(object):
    def __init__(self, data):
        self.data = data

    def __call__(self, a, b):
        # compares `a` with `b`, optionally using `data`


sortfunc = MyComp(True)
sorted(mylist, key=sortfunc)

然而,当我尝试这个时,我得到一个TypeError

TypeError: __call__() takes exactly 3 arguments (2 given)

我也试过一个包装函数:

def my_comp(data):
    def comp(a, b):
        ...
    return comp


sortfunc = my_comp(True)
sorted(mylist, key=sortfunc)

但是TypeError也失败了,尽管不同:

TypeError: comp() takes exactly 2 arguments (1 given)

有什么方法可以达到我想要的结果吗?

1 个答案:

答案 0 :(得分:4)

在一般情况下,要定义一些在调用时传递给函数的参数,可以使用functools.partial

>>> from functools import partial
>>> def f(x, y):
    return x + y

>>> g = partial(f, y=2)
>>> g(3) # x=3, y=2
5

在这种情况下,请注意key sorted仅使用单个参数调用 - 使用{{1}为mylist中的每个项生成一个值然后,列表将根据这些值进行排序。它不是用成对的项目来调用的;那是key(见the docs)。