【问题标题】:Using break for nested for loop [closed]对嵌套的 for 循环使用 break [关闭]
【发布时间】:2015-09-24 07:24:19
【问题描述】:

我想对record 应用三个级别的过滤。

  1. rec 在 cname 中。 rec 是>2 个单词的字符串,所以我想考虑将rec 的所有ngram 签入record

    我。如果 gram 匹配到 record 增加 filter_company_level 并将其写入文件

  2. 记录的第二个过滤器针对self.keyword_material_info 列表中的每个值value

    我。如果value 匹配到record 增加filter_with_material_info 并将其写入文件

  3. 第三个过滤器用于self.keyword_bse_list 中的item

    我。如果 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

【问题讨论】:

  • 你的问题本质上是“测试我的代码”吗?
  • @bereal:是为了验证我的代码。我认为这个问题不值得投票,因为我已经清楚地提到了我在做什么和我的尝试。提醒您一下,SO 仅用于编码帮助。
  • code review 更适合这种请求。
  • @bereal:感谢您提供此链接,如果您已申请,我想知道投反对票的原因
  • 原因是这个问题对于 SO 来说是题外话,因为它没有解决您可能遇到的任何特定问题,并且以后不会对任何人有用。

标签: python for-loop break


【解决方案1】:

我已经写了这些代码,它是否满足上述条件,或者有什么错误?他们都没有给出错误,但想确保逻辑是正确的。

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

【讨论】:

  • 谢谢,有没有什么工具或者包可以进行单元测试,或者我应该拿样本数据去检查一下?
  • 如果你想要一些严肃的自动化测试,stdlib 的unittest 包(docs.python.org/2/library/unittest.html)可能是你要找的。您必须重构您的脚本以使其可测试(至少有函数返回值而不是打印它们)。
【解决方案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)

【讨论】:

  • 非常感谢,现在已经很清楚了,我想 break 让我感到困惑。
  • 也感谢第二种方法,但在这种情况下,我可能会面临计算每个 for 循环的值的问题。在函数中,count 变量的行为类似于 local var,并且在每个函数调用期间它将重新启动。所以我更喜欢没有函数的方法
  • 然后将它们放入传递给函数的指挥棒对象中。它有助于将局部变量状态转换为结构化对象,以便您可以传递它。
  • 是的,好吧。很抱歉,但在删除休息后,我在检查结果时遇到了一个问题。
  • 对于任何记录 r1,如果 r1 中存在任何 gram gram,那么 filter_company_level 应该只增加一次。但是这里对于gram 值的每次迭代都会递增。所以对于 20 条记录,我得到了这个结果:Total results : 20 Filter at keyword level : 7 Filter at material info : 97 Filter at company name : 270
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2015-03-12
相关资源
最近更新 更多