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循环的每次迭代中检查它。