将dict的两个python列表与索引结合起来
我想将两个列表合并到一个嵌套结构中 列表A:将dict的两个python列表与索引结合起来,python,list,dataframe,dictionary,merge,Python,List,Dataframe,Dictionary,Merge,我想将两个列表合并到一个嵌套结构中 列表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':[{'
[{'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'}]
我尝试了熊猫加入和合并,但没有结果。当然,我可以遍历列表并逐项执行,但可能有更好的解决方案。根据您所需的输出,您根本不需要列表
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 列表A和列表B必须是字典吗?根据您的示例,元组列表可能更适合表示您的数据,例如list_a->
[(1,'abc'),(2,'bcd'),(3,'efg')]
,这对眼睛的伤害也更小。数据来自通过sqlalchemy读取到pandas数据框中的sql,因此元组就可以了。谢谢Bhagirathi!这当然是一个解决办法。因为我有大约10000条记录要合并,所以我只是在寻找一个高性能的解决方案。List_B可能有与List_a不匹配的项,因此会被忽略。例如。列表B:[{'ref':1,'name':'xyz'},{'ref':2,'name':'opq'},{'ref:2,'name':'jkl'},{'ref':3,'name':'nmo'},{'ref':4,'name':'rst'}]
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)