python 合并两个查询集并添加匹配记录
python merge two query sets and addition of matching records
我需要将两个查询集与相似数据合并在一起。
第 1 组(统计数据)包含球队列表、该球队的总分以及该球队所在的分区。
第 2 组(备用)有一个团队列表,其中包括团队和积分(此组没有划分)。
我想做的是将查询集合并为一个,当球队比赛时,只需将备用积分加到球队总分上,保留球队名称和分区。
我在下面使用的代码可以满足我的要求,只是它不包括从未有过备用代码的团队。
考虑以下数据。
统计列表
- 第 1 队:8 分:A 组
- 第 2 队:3 分:B 组
- 第 3 队:7 分:A 组
- 第 4 队:5 分:B 组
- 第 5 队:4 分:A 组
备件清单
- 第 1 队:3 分
- 第 3 队:6 分
所以我想做的是合并这两个列表,其中团队匹配但总分。在这种情况下,最终列表将如下所示:
最终名单
- 第 1 队:11 分:A 组
- 第 2 队:3 分:B 组
- 第 3 队:13 分:A 组
- 第 4 队:5 分:B 组
- 第 5 队:4 分:A 组
第 1 队和第 3 队从备用列表中添加了新的总数。
我现在使用的对我不起作用的代码接近我想要的
full_stats = {}
for stat in stats:
for spare in spares:
if stat['team'] == spare['team']:
tot_points = int(stat['points']) + int(spare['points'])
full_stats.append([stat['team'],tot_points],stat['division'])
break
else:
continue
full_stats
将只显示有备件的团队(团队 1 和 3)
如果我将 full_stats.append([stat['team'],stat['points'],stat['division'])
添加到 else,它会复制数据。所以它会显示 7 个项目。这是统计列表中的 5 个原始团队积分,然后是团队 1 和团队 3 的两个新总分。
我知道我在这里有逻辑上的误解,但我无法弄清楚如何添加这些并且只向我展示了 5 个团队,其中备件列表中的重复项已添加到统计列表中同名。
我在 django 视图中执行此操作,并将 full_stats 的结果呈现给模板。
如有任何帮助,我们将不胜感激。
谢谢,
江淮
您永远不会将非备用团队统计数据放入结果字典中。我建议首先加载 stats
,然后使用来自 spares
的信息进行更新。我把点数和除法作为团队键入的字典的二元组成员。
full_stats = {}
for stat in stats:
full_stats[stat['team']] = (int(stat['points'],stat['division'])
for spare in spares:
team = spare['team']
if team in full_stats:
full_stats[team] = full_stats[team(0)] + int(spare['points'])
应该可以实现您的目标。
@Alan-hover 答案接近我想要的,但我不希望那里的第二个元组迭代。但是,分离 for 循环而不是尝试以嵌套方式进行循环为我提供了正确的方向。谢谢 Alan。
这是我为使这项工作适合我所做的代码更改。
full_stats = []
for stat in stats:
full_stats.append({'team': stat['team'],'points': stat['points']})
for stat in full_stats:
for spare in spares:
if stat['team'] == spare['team']:
total_points = int(stat['points']) + int(spare['points'])
stat['points'] = total_points
我需要将两个查询集与相似数据合并在一起。
第 1 组(统计数据)包含球队列表、该球队的总分以及该球队所在的分区。
第 2 组(备用)有一个团队列表,其中包括团队和积分(此组没有划分)。
我想做的是将查询集合并为一个,当球队比赛时,只需将备用积分加到球队总分上,保留球队名称和分区。
我在下面使用的代码可以满足我的要求,只是它不包括从未有过备用代码的团队。
考虑以下数据。
统计列表
- 第 1 队:8 分:A 组
- 第 2 队:3 分:B 组
- 第 3 队:7 分:A 组
- 第 4 队:5 分:B 组
- 第 5 队:4 分:A 组
备件清单
- 第 1 队:3 分
- 第 3 队:6 分
所以我想做的是合并这两个列表,其中团队匹配但总分。在这种情况下,最终列表将如下所示:
最终名单
- 第 1 队:11 分:A 组
- 第 2 队:3 分:B 组
- 第 3 队:13 分:A 组
- 第 4 队:5 分:B 组
- 第 5 队:4 分:A 组
第 1 队和第 3 队从备用列表中添加了新的总数。
我现在使用的对我不起作用的代码接近我想要的
full_stats = {}
for stat in stats:
for spare in spares:
if stat['team'] == spare['team']:
tot_points = int(stat['points']) + int(spare['points'])
full_stats.append([stat['team'],tot_points],stat['division'])
break
else:
continue
full_stats
将只显示有备件的团队(团队 1 和 3)
如果我将 full_stats.append([stat['team'],stat['points'],stat['division'])
添加到 else,它会复制数据。所以它会显示 7 个项目。这是统计列表中的 5 个原始团队积分,然后是团队 1 和团队 3 的两个新总分。
我知道我在这里有逻辑上的误解,但我无法弄清楚如何添加这些并且只向我展示了 5 个团队,其中备件列表中的重复项已添加到统计列表中同名。
我在 django 视图中执行此操作,并将 full_stats 的结果呈现给模板。
如有任何帮助,我们将不胜感激。
谢谢, 江淮
您永远不会将非备用团队统计数据放入结果字典中。我建议首先加载 stats
,然后使用来自 spares
的信息进行更新。我把点数和除法作为团队键入的字典的二元组成员。
full_stats = {}
for stat in stats:
full_stats[stat['team']] = (int(stat['points'],stat['division'])
for spare in spares:
team = spare['team']
if team in full_stats:
full_stats[team] = full_stats[team(0)] + int(spare['points'])
应该可以实现您的目标。
@Alan-hover 答案接近我想要的,但我不希望那里的第二个元组迭代。但是,分离 for 循环而不是尝试以嵌套方式进行循环为我提供了正确的方向。谢谢 Alan。
这是我为使这项工作适合我所做的代码更改。
full_stats = []
for stat in stats:
full_stats.append({'team': stat['team'],'points': stat['points']})
for stat in full_stats:
for spare in spares:
if stat['team'] == spare['team']:
total_points = int(stat['points']) + int(spare['points'])
stat['points'] = total_points