列表理解中的内循环条件

时间:2017-12-04 12:04:07

标签: python django list-comprehension

我有检查产品及其变化的可用性的功能。两个模型都有quantity_left字段。

如果某个产品有变化,我希望从变体中获得quantity_left,否则我将从产品中获取quantity_left

def check_quota(products):
    q_list = []
    for p in products:
        if p.has_variations:
            for v in p.variations:
                q_list.append(v.quantity_left)
        else:
            q_list.append(p.quantity_left)
    return sum(q_list) 

因此,上述函数将返回0any number。如果是zero则表示产品已售罄。

上面的代码工作正常,但我想使用列表理解来优化这个功能。

我试过了,但这似乎不起作用。

return sum([v.quantity_left if p.has_variations else p.quantity_left for p in products for v in i.variations])

如何在内循环上应用if p.has_variations

更新

假设我有3件衬衫类别的产品

[
  {
    "name":"full sleve", 
    "has_variations": True, 
    "variations":[
       {
         "type": "S size", 
         "quantity_left": 3
       }, 
       {
         "type": "L size", 
         "quantity_left": 0
       }
     ]
  },
  {
    "name":"half sleve", 
    "has_variations": False, 
    "quantity_left": 0
  },
  {
    "name":"sleve less", 
    "has_variations": False, 
    "quantity_left": 10
  }
]

# it will return 13 means not sold out.

1 个答案:

答案 0 :(得分:2)

下面的代码可以解决问题。

def check_quota(products):
    return sum(sum(v.quantity_left for v in p.variations) if p.has_variations else p.quantity_left for p in products)

如果没有实际数据或输入所需输出的任何示例,很难找到可行的解决方案。上面的代码是翻译。

从您的编辑,您似乎正在使用词典而不是课程。如果确实如此,请改用以下内容:

def check_quota(products):
    return sum(sum(v['quantity_left'] for v in p['variations']) if p['has_variations'] else p['quantity_left'] for p in products)