Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将dict的两个python列表与索引结合起来_Python_List_Dataframe_Dictionary_Merge - Fatal编程技术网

将dict的两个python列表与索引结合起来

将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':[{'

我想将两个列表合并到一个嵌套结构中

列表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'}]


我尝试了熊猫加入和合并,但没有结果。当然,我可以遍历列表并逐项执行,但可能有更好的解决方案。

根据您所需的输出,您根本不需要列表

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)