【问题标题】:python merge two query sets and addition of matching recordspython合并两个查询集并添加匹配记录
【发布时间】:2018-07-01 19:06:32
【问题描述】:

我需要将两个查询集与相似数据合并在一起。

第 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 的结果呈现给模板。

任何帮助将不胜感激。

谢谢, jAC

【问题讨论】:

    标签: python django list django-queryset array-merge


    【解决方案1】:

    您永远不会将非备用团队统计数据放入结果字典中。我建议先加载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'])
    

    应该完成你所追求的。

    【讨论】:

    • 如果我这样做,那么我会得到所有结果,包括自己的备件。请记住,这是一个嵌套的 for 循环。所以我只希望它在两个列表中的团队匹配并将两点相加时将匹配附加到列表中。然后追加剩余的不匹配的值。
    【解决方案2】:

    @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
    

    【讨论】:

    • 很高兴听到。我想展示迭代/填充技术,而不必制作一些只会在不理解的情况下复制/粘贴到您的代码中的东西。
    • @AlanHoover 我很感激。您的回答确实将我推向了我正在寻找的正确方向,所以也感谢您!现在我有两种方法来完成它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2018-05-29
    • 2017-12-04
    • 2021-09-03
    • 1970-01-01
    • 2013-01-30
    • 2018-01-08
    相关资源
    最近更新 更多