【问题标题】:combine two python lists of dict with index将 dict 的两个 python 列表与索引结合起来
【发布时间】:2020-10-10 08:01:10
【问题描述】:

我想将两个列表合并成一个嵌套结构。

列表_A:[{'id':1,'val':'abc'},{'id':2,'val':'bcd'},{'id':3,'val':'efg'}]
列表_B:[{'ref':1,'name':'xyz'},{'ref':2,'name':'opq'},{'ref:2,'name':'jkl'},{'ref':3,'name':'nmo'}]

结果应该是:

列表_C:[{'id':1,'list_b':[{'name':'xyz'}]},{'id':2,'list_b':[{'name':'opq'},{'name':'jkl'}]},{'id':3,'list_b':[{'name':'nmo'}]}]

我尝试了 pandas join 和 merge,但没有结果。当然,我可以遍历列表并逐键执行,但可能会有更好的解决方案。

【问题讨论】:

  • List_A 和 List_B 必须是字典吗?根据您的示例,元组列表可能更适合表示您的数据,例如 List_A -> [(1, 'abc'), (2, 'bcd'), (3, 'efg')],这对眼睛的伤害也较小。
  • 数据来自通过 sqlalchemy 读入 pandas 数据帧的 sql,所以元组就可以了。

标签: python list dataframe dictionary merge


【解决方案1】:

根据您想要的输出,您根本不需要 List_A。

from collections import defaultdict

b = [{'ref':1,'name':'xyz'}, {'ref':2,'name':'opq'}, {'ref':2,'name':'jkl'},{'ref':3,'name':'nmo'}]
dct = {}
[dct.setdefault(tuple(i), list()).append(j) for *i, j in [tuple(x.values()) for x in b]]
[{'id':k[0], 'list_b':list({'name': n} for n in v)} for k, v in dct.items()]

输出:

[{'id': 1, 'list_b': [{'name': 'xyz'}]},
 {'id': 2, 'list_b': [{'name': 'opq'}, {'name': 'jkl'}]},
 {'id': 3, 'list_b': [{'name': 'nmo'}]}]

总体而言,这似乎是一种过于复杂的数据存储方式,但如果您需要这种特定格式(例如用于另一个程序的输入),那么 w/e.

【讨论】:

  • List_B 可能包含与 List_A 不匹配的项目,因此被忽略。例如。 List_B: [{'ref':1,'name':'xyz'},{'ref':2,'name':'opq'},{'ref:2,'name':'jkl'}, {'ref':3,'name':'nmo'},{'ref':4,'name':'rst'}]
【解决方案2】:
from copy import deepcopy
List_C = deepcopy(List_A)
for dct1 in List_C:
    dct1.pop('val')
    dct1['list_b'] = list()
    for dct2 in List_B:
        if dct1['id'] == dct2['ref']:
            dct3 = dct2.copy()
            dct3.pop('ref')
            dct1['list_b'].append(dct3)

【讨论】:

  • 感谢巴吉拉蒂!这当然是一个解决方案。因为我有大约 10,000 条记录要合并,所以我只是在寻找一个高性能的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 2018-07-29
  • 1970-01-01
  • 2020-10-09
  • 2021-11-23
  • 1970-01-01
  • 2021-11-21
  • 2012-08-18
相关资源
最近更新 更多