使用“ if ...”语句遍历两个列表

时间:2020-05-17 14:13:51

标签: python list loops if-statement try-except

我有3个列表。

values_to_add = []
values_to_remove = []
values_to_keep = []

一次仅填充列表之一。如果填充了两个列表之一,我想执行此操作:

if values_to_remove or values_to_keep:
    if values_to_remove:
        for value in values_to_remove:
            try:
                value_object.related_value.get(value=value)
            except exceptions.ObjectDoesNotExist:
                raise UnableToUpdate("These values are not related!")
    elif values_to_keep:
        for value in values_to_keep:
            try:
                value_object.related_value.get(value=value)
            except exceptions.ObjectDoesNotExist:
                raise UnableToUpdate("These values are not related!")        

但是,这段代码似乎很笨拙,我相信有一种更简洁的编写方式,因为它实际上是在重复代码。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

if values_to_remove or values_to_keep:
    for value in (values_to_remove if len(values_to_remove) else values_to_keep):
        try:
            value_object.related_value.get(value=value)
        except exceptions.ObjectDoesNotExist:
            raise UnableToUpdate("These values are not related!")

答案 1 :(得分:1)

您可以删除上面的if语句,它可能不会对代码的功能产生任何影响。这样可以使其更清洁,更快一些。

if values_to_remove:
    for value in values_to_remove:
        try:
            value_object.related_value.get(value=value)
        except exceptions.ObjectDoesNotExist:
            raise UnableToUpdate("These values are not related!")
elif values_to_keep:
    for value in values_to_keep:
        try:
            value_object.related_value.get(value=value)
        except exceptions.ObjectDoesNotExist:
            raise UnableToUpdate("These values are not related!")

您还可以使用矩阵(二维数组)遍历所有数组,如下所示:

values = [
    [], #values_to_keep
    [] #values_to_remove
]

for array in values:
    if array:
        for value in values_to_remove:
            try:
                value_object.related_value.get(value=value)
            except exceptions.ObjectDoesNotExist:
                raise UnableToUpdate("These values are not related!")
        break

尽管我只建议使用更多的数组来执行此操作,否则将使您的代码变得比所需的复杂。

答案 2 :(得分:0)

如果您知道仅填充了一个列表,则可以按顺序运行两个循环:

for value in values_to_remove:
    # body elided 

for value in values_to_keep:
    # body elided

或者因为主体相同:

def body(value):
    # body elided
for value in values_to_remove + values_to_keep:
    body(value)