Python 空集检查不需要';我不能在第一次迭代中工作
我使用这个循环检查文档列表中单词列表的出现情况。我想在最后得到的是所有单词出现的所有文档的列表 数据结构包括:Python 空集检查不需要';我不能在第一次迭代中工作,python,set,Python,Set,我使用这个循环检查文档列表中单词列表的出现情况。我想在最后得到的是所有单词出现的所有文档的列表 数据结构包括: listOfTems = [term1, term2, ..., termN] docs = { termJ = { docK: R } . . . termL = { docM: S } } # termJ appears in docK R times 代码如下: firstTerm = True for term in listOfTer
listOfTems = [term1, term2, ..., termN]
docs = {
termJ = { docK: R }
.
.
.
termL = { docM: S }
}
# termJ appears in docK R times
代码如下:
firstTerm = True
for term in listOfTerms :
if not firstTerm :
docs = docs.intersection( docsWhere[term].keys() )
else :
docs = set( docsWhere[term].keys() )
firstTerm = False
if not docs :
break
因为我想要集合的交集,如果在任何一点集合是空的,就没有继续的点,所以我退出循环。在第一次迭代中,我需要做一个例外,用包含第一个单词的文档创建初始文档集,因为我不想创建一个包含所有文档编号的初始文档集,因为有很多文档
问题是,如果初始单词没有出现在任何文档(空集)上,则循环仍会指向第二个单词,然后退出循环
如何使循环在第一个单词上停止
谢谢我将使用enumerate来提供索引,而不是跟踪第一项布尔值,然后使用就地
交叉点更新
方法,我认为这将解决您的问题:
for index, term in enumerate(listOfTerms):
if index == 0:
docs = set(docsWhere[term].keys())
else:
docs.intersection_update(docsWhere[term].keys())
if not docs:
break
或者您可以使用iter()
创建一个iterable来简化控制流,假设您总是得到一个非空列表:
iter_listOfTerms = iter(listOfTerms)
docs = set(docsWhere[next(iter_listOfTerms)].keys())
for term in iter_listOfTerms:
docs.intersection_update(docsWhere[term].keys())
if not docs:
break
如果您不总是得到一个非空列表,那么您需要更多的控制流
if listOfTerms:
iter_listOfTerms = iter(listOfTerms)
docs = set(docsWhere[next(iter_listOfTerms)].keys())
for term in iter_listOfTerms:
docs.intersection_update(docsWhere[term].keys())
if not docs:
break
else: # optional empty set if you didn't get a list with anything.
docs = set()
如果您只是在
for
循环之外处理第一个术语,并在其内部处理任何剩余的术语(在术语列表中使用for terms[1::
),则无需使用firstTerm
变量并在for循环的每次迭代中检查它。