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

时间:2009-06-05 16:24:18

标签: python django list

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

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

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

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

if currency:
  entries = entries.filter(item_currency=currency)

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

totals['quantity'] = sum([e.quantity for e in entries])

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

totals['quantity'] = sum([e.quantity for e in entries if item_currency = currency])

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

1 个答案:

答案 0 :(得分: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

然后

totals['quantity'] = sum([e.quantity for e in entries if EntryMatches(e)])

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