Python lambda函数错误:TypeError:';功能';对象是不可编辑的
我正在尝试执行以下操作: 我谈到了我必须使用函数“compute\u cluster\u compositions”的部分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 =
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]