如何在Python词典中合并数据

时间:2019-02-21 09:43:32

标签: python django python-3.x

我有一个python字典,例如

my_list = [{'orderproduct_id': 76, 'orderproduct_quantity': '500', 'orderbatch_id': 'FOX19022019-2'}, 
           {'orderproduct_id': 76, 'orderproduct_quantity': '500', 'orderbatch_id': 'FOX19022019-1'}, 
           {'orderproduct_id': 77, 'orderproduct_quantity': '100', 'orderbatch_id': 'FOX19022019-1'}]

我想要输出

my_list = [{'orderproduct_id': 76, 
            'batches': [{'orderproduct_quantity': '500', 'orderbatch_id': 'FOX19022019-2'}, 
                        {'orderproduct_quantity': '500', 'orderbatch_id': 'FOX19022019-1'}
                       ]
           }, 
           {'orderproduct_id': 77, 
            'batches': [{'orderproduct_quantity': '100', 'orderbatch_id': 'FOX19022019-1'}
                       ]
           }]

我正在Django视图中使用它,因此,如果任何Django函数或python概念可以工作,请告诉我。 谢谢。

3 个答案:

答案 0 :(得分:2)

尝试以下类似方法!首先,创建字典以将orderproduct_id保留为关键字,并将每个orderproduct_quantityorderbatch_id(都作为字典添加到列表)。然后,只需使用压缩列表将字典转换为字典列表即可,其中将是orderproduct_id,而将是{{1} }。

batches

答案 1 :(得分:2)

您可以使用itertools:

from itertools import groupby

new_list = [ {'orderproduct_id': k, 'batches': list(i)}  
              for k, i in groupby(my_list, lambda x: x['orderproduct_id'])  ]

已编辑

编辑为:

  1. 排序列表以安全使用groupby
  2. 排除内部列表中的键。

新代码:

from itertools import groupby

my_key = lambda x: x['orderproduct_id']

[ {'orderproduct_id': k, 
   'batches': [ d for d in i if d.pop('orderproduct_id')  ]}  
  for k, i in groupby( sorted(my_list,key=my_key), my_key )  ]

说明

您正在按orderproduct_id分组。然后,自然的方法是使用groupby函数。另一位开发人员几秒钟后看到groupby时,他/她就知道代码正在对元素进行分组。

此外,我的方法使用list comprehension,因为您是从另一个可迭代对象创建新的列表/字典。

答案 2 :(得分:-1)

您可以通过orderproduct_id来分隔项目:

aggregator = defaultdict(list)
for item in my_list:
    aggregator[item.pop('orderproduct_id')].append(item)

然后从聚合的字典项中列出新列表:

new_list = []
for key, value in aggregator.items():
    new_list.append({
        'orderproduct_id': key,
        'batches': value
    })