lambda函数错误:TypeError:' function'对象不可迭代

时间:2017-10-25 12:36:45

标签: python python-3.x numpy lambda

我试图执行以下python notebook

他们来到了我必须使用函数' compute_cluster_similarities'。

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)?什么是排序?

我认为这个错误是由于Python 3引起的,但即使这是在Python 2上执行的,它对我来说也没有意义。 这对我来说很困惑......我怎么能解决这个错误?并且,请给我一些关于它发生了什么的解释,而不仅仅是修复。

编辑: 我使用pdb库来调试代码,我意识到这个错误是由&sorted;(' 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

1 个答案:

答案 0 :(得分:1)

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

如果替换:

key = lambda lbl,sim: -sim

使用:

key=lambda x: -x[1]

它应该按预期工作。

有关如何使用sortedkey参数的详细说明,请参阅documentation