【发布时间】:2016-12-14 22:00:08
【问题描述】:
Team 和 League 之间存在多对一关系
以下代码加入表格,并按goals_for 为league 中的每个team 排序联赛:
for league in League.query.join(League.teams).order_by(desc(Team.goals_for)):
total_goals = 0
for team in league.teams:
total_goals += team.goals_for
print("Total goals scored in", league.full_name, "is", total_goals)
正确产生:
德甲总进球数为 22
英超联赛总进球数为 15
我想知道两件事:
鉴于
teams基本上是一个列表,因此没有属于每个team实例的total_goals,有没有办法在没有for 循环的情况下对team目标的值求和?如果 1 是可能的,它是否比上面的 for 循环更快/更好?
【问题讨论】:
-
你试过
sum(league.teams)吗?应该更快*,因为sum是在 C 中实现的。*YMMV -
但我需要每个
team的goals_for列,而不是团队的数量。 -
抱歉,误读了正在发生的事情。
sum(team.goals_for for team in league.teams)大致相当于,但作为生成器表达式并使用sum。 -
这不是所谓的理解,只是更快的for循环吗? (说话很菜鸟?)
-
理解与生成器表达式不同。有关更多详细信息,请参阅this question。它们通常更快,因为它们不会将所有项目都保存在内存中。因此,如果您只使用这些值一次,则生成器表达式可能是最佳的。阅读PEP0289 可能会很好。
标签: python sql sqlalchemy flask-sqlalchemy