迭代Python中具有潜在条件的大型列表

Bar*_*tek 1 python django list

我有大量的数据,通常大约有2000多个条目,但在本报告中,我们能够看到我们想要的内容,因此最多可以有10,000条记录

报告分为:两个类别,然后在每个类别中,我们按货币划分,因此我们在列表中有几个子类别.

我的问题在于有效地计算各种小计.我正在使用Django并将模板标签传递给货币和类别(如果适用),然后templatetag呈现总计.请注意,有时我只为该类别设置了一个小计,没有通过任何货币.

最初,如果有像这样的货币/类别,我只使用.filter()对每个小计使用单独的查询:

if currency:
  entries = entries.filter(item_currency=currency)
Run Code Online (Sandbox Code Playgroud)

这成了一个问题,因为我会有太多的查询,而且生成时间太长(2000+ ms),所以我选择使用list(条目)来立即执行我的查询,然后通过简单的循环遍历它列表理解:

totals['quantity'] = sum([e.quantity for e in entries])
Run Code Online (Sandbox Code Playgroud)

如果你还没有看到我的问题,那就在于......如何在每个列表理解中有效地添加货币/类别的条件?有时他们不会在那里,有时他们会这样,所以我不能简单地输入:

totals['quantity'] = sum([e.quantity for e in entries if item_currency = currency])
Run Code Online (Sandbox Code Playgroud)

我可以制作一个巨大的if-block,但这不是很干净并且是一个维护灾难,所以我正在向Stackoverflow社区寻求一些洞察力...提前感谢:)

Jac*_*b B 6

您可以定义一个小内联函数:

def EntryMatches(e):
  if use_currency and not (e.currency == currency):
    return False
  if use_category and not (e.category == category):
    return False
  return True
Run Code Online (Sandbox Code Playgroud)

然后

totals['quantity'] = sum([e.quantity for e in entries if EntryMatches(e)])
Run Code Online (Sandbox Code Playgroud)

EntryMatches()可以访问封闭范围内的所有变量,因此无需传入任何参数.您可以获得所有使用条目的逻辑在一个地方的优势,您仍然可以使用列表解析来使sum()更具可读性,但您现在可以在EntryMatches()中拥有任意逻辑.