首页 > 解决方案 > 如何在具有不同条件的列表上迭代两次?

问题描述

我有一个这样的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 语句)之后?

标签: pythonloopsfor-loopif-statement

解决方案


你可以只有两个显式循环。在这种情况下,你的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
            )

推荐阅读