对嵌套for循环使用break

2024-03-28 11:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对record应用三个级别的过滤。你知道吗

  1. rec在cname中。rec是由大于2个单词组成的字符串,因此我想考虑将rec的所有ngram签入record

    i.如果gram匹配成record增量filter_company_level并将其写入文件

  2. 记录中的第二个筛选器用于self.keyword_material_info列表中的每个值value。你知道吗

    i.如果value匹配成record增量filter_with_material_info并将其写入文件

  3. 第三个过滤器用于self.keyword_bse_list中的item。你知道吗

    i.如果item匹配成record增量filter_with_keyword_info并将其写入文件

    二。如果最里面的过滤器存在,现在移动到下一个记录。

我已经写了这些代码,它是否满足上述条件,或者是否有任何错误?他们都没有给出错误,只是想确保逻辑是正确的。你知道吗

        for record in fetch_record:
            total += 1
            for rec in cname:
                try:
                    c_ngram = self.get_ngrams(rec['company_name'])
                    for gram in c_ngram:
                        if gram.lower()+' ' in u'{} {}'.format(record['title'], record['description']).lower():
                            filter_company_level += 1
                            # print "Matched based on company name : ", record['article_link']
                            company_write.write(record['article_link']+' - '+rec['company_name']+' - '+rec['company_code']+'\n')
                            for value in self.keyword_material_info:
                                if value.lower()+' ' in u'{} {}'.format(record['title'], record['description']).lower():
                                    filter_with_material_info += 1
                                    materialinfo_write.write(record['article_link']+' - '+rec['company_name']+' - '+rec['company_code']+' - '+value+'\n')
                                    for item in self.keyword_bse_list:
                                        if item.lower()+' ' in u'{} {}'.format(record['title'], record['description']).lower():
                                            filter_with_keyword_info += 1
                                            keyword_write.write(record['article_link']+' - '+rec['company_name']+' - '+rec['company_code']+" - "+value+' - '+item+'\n')
                                            print record['article_link']
                                            print value
                                            print item
                                            break
                                    break
                            # break
                            raise GetOutOfLoop
                except GetOutOfLoop:
                    break

或者这个是对的?你知道吗

        for record in fetch_record:
            total += 1
            for rec in cname:
                try:
                    c_ngram = self.get_ngrams(rec['company_name'])
                    for gram in c_ngram:
                        if gram.lower()+' ' in u'{} {}'.format(record['title'], record['description']).lower():
                            filter_company_level += 1
                            # print "Matched based on company name : ", record['article_link']
                            company_write.write(record['article_link']+' - '+rec['company_name']+' - '+rec['company_code']+'\n')
                            for value in self.keyword_material_info:
                                if value.lower()+' ' in u'{} {}'.format(record['title'], record['description']).lower():
                                    filter_with_material_info += 1
                                    materialinfo_write.write(record['article_link']+' - '+rec['company_name']+' - '+rec['company_code']+' - '+value+'\n')
                                    flag_keyword = 0
                                    for item in self.keyword_bse_list:
                                        if item.lower()+' ' in u'{} {}'.format(record['title'], record['description']).lower():
                                            filter_with_keyword_info += 1
                                            keyword_write.write(record['article_link']+' - '+rec['company_name']+' - '+rec['company_code']+" - "+value+' - '+item+'\n')
                                            print record['article_link']
                                            print value
                                            print item
                                            flag_keyword = 1
                                            break
                                    if flag_keyword == 1:
                                        break
                            # break
                            if flag_keyword == 1:
                                raise GetOutOfLoop
                except GetOutOfLoop:
                    break

Tags: nameininfoforvaluearticlelinkfilter
2条回答

你不是说:

for record in fetch_record:
    for rec in cname:
        try:
            for gram in c_ngram:
                if x:
                    for value in self.keyword_material_info:
                        if y:
                            for item in self.keyword_bse_list:
                                if z:
                                    raise GetOutOfLoop
        except GetOutOfLoop:
            break

但是,当您认为必须借助异常来摆脱嵌套循环时,我建议将嵌套循环分解为一个函数并使用return。像这样:

def process_record(record):
    for rec in cname:
        for gram in c_ngram:
            if x:
                for value in self.keyword_material_info:
                    if y:
                        for item in self.keyword_bse_list:
                            if z:
                                return

for record in fetch_record:
    process_record(record)

I have written these code, does it satisfy above conditions, or is there any bug? None of them give error but want to make sure that logic is correct.

最好的方法是编写单元测试,将代码的输出与给定输入集的预期输出进行比较。你知道吗

相关问题 更多 >