Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中遍历具有潜在条件的大型列表_Python_Django_List - Fatal编程技术网

在Python中遍历具有潜在条件的大型列表

在Python中遍历具有潜在条件的大型列表,python,django,list,Python,Django,List,我有大量的数据,通常大约有2000多个条目,但在本报告中,我们可以根据需要查看多达10000条记录 报告分为两个类别,然后在每个类别中,我们按货币进行拆分,因此列表中有几个子类别 我的问题在于如何有效地计算各种小计。我使用Django并传递一个模板标记货币和类别(如果适用),然后模板标记呈现总额。注意,有时我只对类别进行小计,没有传递货币 最初,我只是使用.filter()对每个小计使用一个单独的查询,如果有这样的货币/类别: if currency: entries = entries.f

我有大量的数据,通常大约有2000多个条目,但在本报告中,我们可以根据需要查看多达10000条记录

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

我的问题在于如何有效地计算各种小计。我使用Django并传递一个模板标记货币和类别(如果适用),然后模板标记呈现总额。注意,有时我只对类别进行小计,没有传递货币

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

if currency:
  entries = entries.filter(item_currency=currency)
这成为了一个问题,因为我会有太多的查询,并且生成时间太长(2000+ms),所以我选择使用列表(条目)立即执行我的查询,然后使用简单的列表理解进行循环:

totals['quantity'] = sum([e.quantity for e in entries])
如果你还没看到,我的问题在于。。如何在每个列表中有效地添加货币/类别的条件?有时他们不在那里,有时他们会,所以我不能简单地键入:

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

我可以制作一个巨大的if块,但这不是很干净,而且是一个维护灾难,因此我正在联系Stackoverflow社区,以获得一些见解。。提前感谢:)

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

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
然后


EntryMatches()将有权访问封闭范围内的所有变量,因此无需再传入任何参数。这样做的好处是,要使用的所有条目的逻辑都在一个地方,您仍然可以使用列表理解来提高sum()的可读性,但现在您可以在EntryMatches()中使用任意逻辑。

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

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
然后


EntryMatches()将有权访问封闭范围内的所有变量,因此无需再传入任何参数。这样做的好处是,要使用的所有条目的逻辑都在一个地方,您仍然可以使用列表理解来提高sum()的可读性,但现在可以在EntryMatches()中使用任意逻辑。

一个非常次要的想法:只要您以python 2.4或更高版本为目标,生成器表达式周围不需要列表。sum(e表示x中的e)应该略快于sum([e表示x中的e]),并且语义上是等价的。很好!关于这一点,我已经在几个地方修改了我的代码,谢谢:)一个非常次要的想法:只要您的目标是Python2.4或更高版本,就不需要生成器表达式周围的列表。sum(e表示x中的e)应该略快于sum([e表示x中的e]),并且语义上是等价的。很好!关于这一点,我已经在几个地方修改了我的代码,谢谢:)优雅而简单的解决方案。我甚至没想过要这么做。谢谢优雅而简单的解决方案。我甚至没想过要这么做。谢谢