使用Python中的单个键合并两个不同长度的字典列表

渴求知识

当两个列表的长度不同(使用Python 3.6)时,我想在一个键上合并两个字典列表。例如,如果我们有一个称为的字典列表l1

l1 = [{'pcd_sector': 'ABDC', 'coverage_2014': '100'},
       {'pcd_sector': 'DEFG', 'coverage_2014': '0'}]

另一个字典列表称为l2

l2 = [{'pcd_sector': 'ABDC', 'asset': '3G', 'asset_id': '2gs'},
      {'pcd_sector': 'ABDC', 'asset': '4G', 'asset_id': '7jd'},
      {'pcd_sector': 'DEFG', 'asset': '3G', 'asset_id': '3je'},
      {'pcd_sector': 'DEFG', 'asset': '4G', 'asset_id': '8js'},
      {'pcd_sector': 'CDEF', 'asset': '3G', 'asset_id': '4jd'}]

如何将它们合并以使用pcd_sectorthis(?):

result = [{'pcd_sector': 'ABDC', 'asset': '3G', 'asset_id': '2gs', 'coverage_2014': '100'},
          {'pcd_sector': 'ABDC', 'asset': '4G', 'asset_id': '7jd', 'coverage_2014': '100'},
          {'pcd_sector': 'DEFG', 'asset': '3G', 'asset_id': '3je', 'coverage_2014': '0'},
          {'pcd_sector': 'DEFG', 'asset': '4G', 'asset_id': '8js', 'coverage_2014': '0'},
          {'pcd_sector': 'CDEF', 'asset': '3G', 'asset_id': '4jd'}]

到目前为止我尝试过的

我使用以下代码合并了两个列表,但是不幸的是我最终得到了一个简短的版本,而不是所需的完整数据结构。

import pprint
grouped = {}
for d in l1 + l2:
    grouped.setdefault(d['pcd_sector'], {'asset':0, 'asset_id':0, 'coverage_2014':0}).update(d)
result = [d for d in grouped.values()]
pprint.pprint(result)

因此,当我运行代码时,最终会得到以下简短输出:

result = [{'pcd_sector': 'ABDC', 'asset': '3G', 'asset_id': '2gs', 'coverage_2014': '100'},
         {'pcd_sector': 'DEFG', 'asset': '4G', 'asset_id': '8js', 'coverage_2014': '0'},
         {'pcd_sector': 'CDEF', 'asset': '3G', 'asset_id': '4jd'}]
埃里克·杜米尼尔

问题

方法中的问题是,您的数据以键作为键放置在一个groupeddict中,'pcd_sector'但是l2具有相同的多个dict 'pcd_sector'您可以将的元组'pcd_sector', 'asset'用作的键l2,但现在l1不再适用。因此,您需要分两步进行处理,而不是l1 + l2直接进行迭代

理论

如果pcd_sector键在中是唯一的l1,则可以创建一个大字典,而不是一个小字典列表:

>>> d1 = {d['pcd_sector']:d for d in l1}
>>> d1
{'ABDC': {'pcd_sector': 'ABDC', 'coverage_2014': '100'}, 'DEFG': {'pcd_sector': 'DEFG', 'coverage_2014': '0'}}

然后,您只需要合并具有相同pcd_sector的字典

>>> [dict(d, **d1.get(d['pcd_sector'], {})) for d in l2]
[{'asset_id': '2gs', 'coverage_2014': '100', 'pcd_sector': 'ABDC', 'asset': '3G'}, {'asset_id': '7jd', 'coverage_2014': '100', 'pcd_sector': 'ABDC', 'asset': '4G'}, {'asset_id': '3je', 'coverage_2014': '0', 'pcd_sector': 'DEFG', 'asset': '3G'}, {'asset_id': '8js', 'coverage_2014': '0', 'pcd_sector': 'DEFG', 'asset': '4G'}, {'asset_id': '4jd', 'pcd_sector': 'CDEF', 'asset': '3G'}]

完整的代码

放在一起,代码变成:

l1 = [{'pcd_sector': 'ABDC', 'coverage_2014': '100'},
       {'pcd_sector': 'DEFG', 'coverage_2014': '0'}]

l2 = [{'pcd_sector': 'ABDC', 'asset': '3G', 'asset_id': '2gs'},
      {'pcd_sector': 'ABDC', 'asset': '4G', 'asset_id': '7jd'},
      {'pcd_sector': 'DEFG', 'asset': '3G', 'asset_id': '3je'},
      {'pcd_sector': 'DEFG', 'asset': '4G', 'asset_id': '8js'},
      {'pcd_sector': 'CDEF', 'asset': '3G', 'asset_id': '4jd'}]

d1 = {d['pcd_sector']:d for d in l1}
result = [dict(d, **d1.get(d['pcd_sector'], {})) for d in l2]

import pprint
pprint.pprint(result)
#   [{'asset': '3G',
#     'asset_id': '2gs',
#     'coverage_2014': '100',
#     'pcd_sector': 'ABDC'},
#    {'asset': '4G',
#     'asset_id': '7jd',
#     'coverage_2014': '100',
#     'pcd_sector': 'ABDC'},
#    {'asset': '3G',
#     'asset_id': '3je',
#     'coverage_2014': '0',
#     'pcd_sector': 'DEFG'},
#    {'asset': '4G',
#     'asset_id': '8js',
#     'coverage_2014': '0',
#     'pcd_sector': 'DEFG'},
#    {'asset': '3G', 'asset_id': '4jd', 'pcd_sector': 'CDEF'}]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在python中合并两个不同长度的列表

合并两个不同长度的python列表

合并两个相同长度但键不同的数组?

如何在python中合并两个不同长度的数据框

来自Python中2个不同长度列表的字典

合并两个不同长度的数组,键和0填充为空

合并两个具有不同长度,键和值的对象

使用itertools和zip组合从两个不同长度的列表创建字典时出现问题

如何遍历两个不同长度的字典?

熊猫合并两个不同长度的数据框

如何合并两个不同长度的数据帧?

合并两个不同长度的数据框

合并两个不同长度的数据框

如何将两个不同长度的列表合并为Pandas数据框?

将两个列表合并到python中具有多个键的字典列表中

如何从(相同长度和相同键的)两个不同字典的值制作新字典,用作键值对

如何使用两个相同的键和不同的值从 Python 中的三个不同列表创建字典?

不同长度的两个列表的循环组合

遍历两个不同长度的列表

如何交织两个不同长度的列表?

加入两个不同长度的列表

遍历两个不同长度的列表

在JavaScript中使用map()合并(压缩)两个不同长度的数组

使用由两个值组成的键在 Python 中合并两个字典

在Python中平均分布和压缩两个不同长度的列表

如何在 R 中合并具有不同长度和两个条件的两个数据帧?

压缩两个不同长度的列表,并使用默认元素填充

使用lodash比较两个不同长度的数组

使用不同的键在python中合并两个字典