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

2024-03-29 11:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑

似乎我最初的问题是有缺陷的;我把keycmp混淆了,正如KillianDS和jornsharpe所指出的那样。将cpm与我的类callable一起使用,效果如预期。你知道吗

我接受了jornsharpe的答案,因为这是一个更正确的答案“如何用数据来播种函数”。你知道吗

原始问题

在传递函数以与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)

有什么办法能达到我想要的结果吗?你知道吗


Tags: 数据key函数答案selftruedatadef
1条回答
网友
1楼 · 发布于 2024-03-29 11:40:59

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

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

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

在这种情况下,请记住keysorted仅使用单个参数调用-使用keymylist中的每个项生成一个值,然后根据这些值对列表进行排序。它不是用成对的项来调用的;这是cmp(参见the docs)。你知道吗

相关问题 更多 >