【发布时间】: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