Python lambda函数错误:TypeError:';功能';对象是不可编辑的

Python lambda函数错误:TypeError:';功能';对象是不可编辑的,python,python-3.x,numpy,lambda,Python,Python 3.x,Numpy,Lambda,我正在尝试执行以下操作: 我谈到了我必须使用函数“compute\u cluster\u compositions”的部分 def compute_cluster_similarities(kwds, kwd2id, vectors, lbl2centroid): kwd2cluster_sims = dict() for kwd in kwds: ix = kwd2id[kwd] nvec = vectors[ix] sims =

我正在尝试执行以下操作:

我谈到了我必须使用函数“compute\u cluster\u compositions”的部分

def compute_cluster_similarities(kwds, kwd2id, vectors, lbl2centroid):
    kwd2cluster_sims = dict()
    for kwd in kwds:
        ix = kwd2id[kwd]
        nvec = vectors[ix]
        sims = []

        for lbl, centroid in lbl2centroid.items():
            cosine_sim = np.inner(nvec, centroid)
            sims.append((lbl,cosine_sim))
        sims = sorted(sims, key = lambda lbl,sim: -sim)
        kwd2cluster_sims[kwd] = sims
        if len(kwd2cluster_sims) % 1000 == 0:
            print("%i computed out of %i" % (len(kwd2cluster_sims), len(all_kwds)))
    return kwd2cluster_sims
并返回错误:

TypeError:()缺少1个必需的位置参数:“sim”

首先,我仍在努力理解lambda代码的这一部分。我了解了lambda指令的目标是什么,但无法理解这行代码的意义,比如。。它(隐式)是否返回2个值(sims,key)??正在排序什么

我认为这个错误是由Python3引起的,但是即使这是在Python2上执行的,对我来说也没有意义。 这让我很困惑。。。如何解决此错误?请给我解释一下这是怎么回事,而不仅仅是修复

编辑: 我正在使用pdb库调试代码,我意识到这个错误是由'sorted()'函数返回的。最初的错误是:

***TypeError:“函数”对象不可编辑

我所做的:

        cosine_sim = np.inner(nvec, centroid)
        sims.append((lbl,cosine_sim))
    import pdb ; pdb.set_trace();
    sims = sorted(sims, key = lambda lbl,sim: -sim)
并在Pdb模式下运行:

(Pdb) sims, key = lambda lbl,sim: -sim
*** TypeError: 'function' object is not iterable

排序
参数中的函数是使用列表的元素获取的,因此它只接受一个参数

如果替换为:

key = lambda lbl,sim: -sim
与:

它应该像你期望的那样工作


有关如何使用
sorted
key
参数的更多说明,请参阅。

key=lambda-lbl,sim:-sim
相当于
def-key(lbl,sim):return-sim
,但您不能将后者放入表达式中。但是“sims,key=lambda-lbl”上的“sims”怎么办,sim:-sim'?这与lambda无关
sims
被传递到
sorted
,因为您想对其进行排序。
参数告诉它如何排序。你应该读一本关于Python排序的教程,也许还有关于函数和关键字参数的教程??它被覆盖了吗?请参阅我的编辑它只是用于动态排序:您有一个项目列表,其中每个项目本身就是一个列表,您希望根据“内部”列表的第二个元素对其进行排序,因此,
sorted
对每个元素调用的
key
的结果进行排序,而不是对项目进行排序。
sim
变量用于访问第二个元素,但它不会“按原样”工作。因此调用“sorted(a,b)”与“sorted(a)”相同;(二)"??那么这个函数中变量“key”的目标是什么?这是在哪里用的?不,不是。您是否阅读过:(尤其是
关键功能部分)
key
不是
变量
它是传递给
sorted
的关键字参数,因此它在内部使用。我认为这是因为它可以更清楚地表述,例如,通过包含一个最小的工作示例来显示您不清楚的特定方面,而不是从更难复制的更大代码库中摘录。另外,如果您回顾一下讨论,它可以归结为您不清楚的Python语法,这在一定程度上很难从当前编写的问题中推断出来。
key=lambda x: -x[1]