【问题标题】:How to iterate twice over a list with different conditions?如何在具有不同条件的列表上迭代两次?
【发布时间】:2020-06-03 21:02:50
【问题描述】:

我有一个这样的 for 循环:

    for category in enums.Category:
        category_name = str(category.name)
        internal_code = category.internal_code

        if category_name in labels and not category.is_temporary_code:
            field_label = labels[category_name]
            self.fields[internal_code] = forms.BooleanField(label=field_label, required=False)

        elif category_name in labels and category.is_temporary_code:
            field_label = labels[category_name]
            exp_date_label = labels[category_name] + " end date"
            self.fields[internal_code] = forms.BooleanField(label=field_label, required=False)
            self.fields[internal_code + "_end_date"] = forms.DateField(
                label=exp_date_label, required=False
            )

但是,这会遍历枚举 Category 实例并按实例的顺序生成结果(表单字段)。我如何编写这个循环,以便每个属于第一个“if”条件的实例首先设置其表单字段,然后循环重新运行以设置第二组实例的表单字段(来自 elif 语句)AFTER?

【问题讨论】:

  • 创建两个列表,一个用于第一个项目,一个用于第二个项目。在 if/elif 中,您只需将项目添加到这些列表之一。在 for 循环之后,您循环两个列表的项目,然后添加到表单中。
  • 替代方案是两个 for 循环以及一个执行 if/elif 分离的列表推导。我正在打电话,否则我会提供一些代码...

标签: python loops for-loop if-statement


【解决方案1】:

你可以有两个显式循环。在这种情况下,您的ifelif 条件已经相互排斥,因此在第二种情况下无需执行if (condition2) and not (condition1):,只需if (condition2): 就足够了。 因此,这里有少量重复的代码,但可能不足以担心。

(我已将internal_code 的分配移到if 块内,因为不需要评估条件。)

    for category in enums.Category:
        category_name = str(category.name)
        if category_name in labels and not category.is_temporary_code:
            internal_code = category.internal_code
            field_label = labels[category_name]
            self.fields[internal_code] = forms.BooleanField(label=field_label, required=False)

    for category in enums.Category:
        category_name = str(category.name)
        if category_name in labels and category.is_temporary_code:
            internal_code = category.internal_code
            field_label = labels[category_name]
            exp_date_label = labels[category_name] + " end date"
            self.fields[internal_code] = forms.BooleanField(label=field_label, required=False)
            self.fields[internal_code + "_end_date"] = forms.DateField(
                label=exp_date_label, required=False
            )

【讨论】:

    【解决方案2】:

    最简单的方法是复制代码。第二种最简单的方法是在里面运行整个 for 循环 在 (1,2) 中运行: 只需检查条件中的“运行”即可。

    顺便说一句,如果你有的话,你可以避免用重复的条件做一个 elif

    if not category_name in labels:
        continue
    if category.is_temporary_code:
        <code>
    else:
        <code>
    

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2013-04-13
      • 2022-11-03
      相关资源
      最近更新 更多