【问题标题】:Iterating through two lists with 'if... or' statement使用 'if... or' 语句遍历两个列表
【发布时间】:2020-09-03 06:49:13
【问题描述】:

我有 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


【解决方案1】:
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!")

【讨论】:

  • 顺便说一句,第一行是多余的。
  • 如果有两种情况: values_to_remove 和 values_to_keep 都不为空 - 我们需要这一行。在另一种情况下 - 当然,没有必要使用它。让ts为他选择最好的。
【解决方案2】:

您可以去掉上面的 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

虽然我只建议使用更多的数组来执行此操作,否则它会使您的代码变得比需要的更复杂。

【讨论】:

    【解决方案3】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      相关资源
      最近更新 更多