【问题标题】:lambda function error: TypeError: 'function' object is not iterablelambda函数错误:TypeError:'function'对象不可迭代
【发布时间】:2017-10-25 12:36:44
【问题描述】:

我正在尝试执行以下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()' 函数返回的。原来的错误是:

*** TypeError: 'function' object is not iterable

我做了什么:

        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 等价于def key(lbl, sim): return -sim,但不能将后者放入表达式中。
  • 但是 'sims, key = lambda lbl,sim: -sim' 上的 'sims' 呢??
  • 这与 lambda 无关。 sims 被传递给 sorted 因为你想对其进行排序。 key 参数告诉它如何 排序。您应该阅读有关 Python 排序的教程,也许还应该阅读有关函数和关键字参数的教程。

标签: python python-3.x numpy lambda


【解决方案1】:

sortedkey 参数中的函数是与列表的元素一起获取的,因此它只接受一个参数。

如果你替换:

key = lambda lbl,sim: -sim

与:

key=lambda x: -x[1]

它应该可以按您的预期工作。

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

【讨论】:

  • 但是“sims”变量的意义何在?是否被覆盖?请看我的编辑
  • 它只是在运行中用于排序:你有一个项目列表,其中每个项目本身就是一个列表,你想根据“内部”列表的第二个元素对它们进行排序,所以在对项目进行排序时,sorted 对在每个元素上调用的 key 的结果进行排序。 sim 变量旨在访问第二个元素,但它不会“按原样”工作。
  • 所以调用 'sorted(a,b)' 与 'sorted(a);排序(b)'?那么这个函数中变量'key'的目的是什么?这是在哪里使用的?
  • 不,不是。你读过:docs.python.org/3.5/howto/sorting.html#sortinghowto(尤其是key functions部分)吗? key 不是variable 它是传递给sorted 的关键字参数,所以它在内部使用它。
  • 我认为这是因为它可以更清晰地表述,例如通过包含一个最小的工作示例来显示您不清楚的特定方面,而不是从更大的代码库中摘录更多难以复制。此外,如果您回顾讨论,它可以归结为您不清楚的 Python 语法,这有点难以从问题中推断出来,因为它目前是写的。
猜你喜欢
  • 2016-07-31
  • 2014-05-03
  • 2018-10-27
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多