【发布时间】:2015-04-27 19:13:50
【问题描述】:
我正在尝试使用 NLTK 的文本拼接代码 (https://github.com/nltk/nltk/blob/develop/nltk/tokenize/texttiling.py)。
这是一个根据内容将文档输入分割成几个图块的代码。我注意到通过将整个文本作为一个平铺返回,某些文档的平铺根本不起作用,并且发现这部分代码的工作方式很奇怪。
depth_tuples = sorted(zip(depth_scores, range(len(depth_scores))))
depth_tuples.reverse()
hp = filter(lambda x:x[0]>cutoff, depth_tuples)
for dt in hp:
boundaries[dt[1]] = 1
for dt2 in hp: #undo if there is a boundary close already
if dt[1] != dt2[1] and abs(dt2[1]-dt[1]) < 4 \
and boundaries[dt2[1]] == 1:
boundaries[dt[1]] = 0
return boundaries
Depth_tuple 是一个包含元组列表 [(score, index)] 的列表,而 hp 是一个过滤结果,其分数大于某个截止值。
使用嵌套循环,它对 hp 的每个条目分别迭代两次。换句话说,对于 hp 的每个条目,它应该检查 hp 的所有条目。但我注意到第二个循环(对于 hp 中的 dt2)在第一次迭代后没有执行。这就像 dt2 指针到达第一个 dt 的 hp 末尾,并且它没有为新的迭代初始化。
给你一个这个现象的简化例子, 说 x = [(0.6,3),(0.2,1),(0.5,2),(0.4,3)]
如果截止值为 0.3,则 hp 包含 [(0.6,3), (0.5, 2), (0.4, 3)]
所以循环应该是这样的
当 x = (0.6, 3) 时,第二个循环检查 [(0.6,3), (0.5, 2), (0.4, 3)]
当 x = (0.5, 2) 时,第二个循环再次检查 [(0.6,3), (0.5, 2), (0.4, 3)]
但它只在 x=(0.6, 3) 时这样做,并且对于 x 的其余部分,第二个循环不会运行。
我最初怀疑迭代器在第二个循环中已经到达了 hp 的末尾,但它无法解释第一个循环的 hp 中的迭代器如何仍然可以去......
您能解释一下为什么会这样吗?谢谢!
【问题讨论】:
-
同时,请尝试将其重组为minimal, complete, verifiable example,其中包括演示问题的示例输入(例如,硬编码到变量中,如
depth_tuple = [(1, 4), (7, 3), (3, 2)])。 -
还有,这是哪个 Python 版本?
-
最后,当你说“第一次迭代后没有执行第二次循环”时,这是否意味着你进入了外循环的第二次迭代(并设置
boundaries[dt] = 1),但内循环是空的?还是第一个循环也结束了? -
@abarnert 更新了示例并添加了 python 版本!我的意思是内部循环是空的。
标签: python loops python-3.x lambda