使用'if ...或'语句遍历两个列表

问题描述 投票:1回答:3

我有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!")        

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

python list loops if-statement try-except
3个回答
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
投票

您可以删除上面的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!")

0
投票

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

for value in values_to_remove:
    # body elided 

for value in values_to_keep:
    # body elided

或由于主体相同:

for value in values_to_remove + values_to_keep:
    # body here
© www.soinside.com 2019 - 2024. All rights reserved.