在python中列出要合并的操作

2024-09-30 02:27:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个场景,其中我有两个列表l1&;l2如下所述:

l1 = [{'app_id': 9833, 'state': 0}, {'app_id': 1036, 'state': 1}, {'app_id': 1039, 'state': 0},{'app_id': 1030, 'state': 0}]

l2 = [{'app_id': 9833, 'name': ABC}, {'app_id': 1036, 'name': CDE}, {'app_id': 1039, 'name': XYZ},{'app_id': 1030, 'name': JKL}]

我试图在这两个列表中检查app_id是否在两个列表中都是公共的,如果是公共的,那么在第三个列表中也添加name值,因此所需的输出应该是这样的

l3 = [{'app_id': 9833, 'name': ABC, 'state': 0}, {'app_id': 1036, 'name': CDE, 'state': 1}, {'app_id': 1039, 'name': XYZ, 'state': 0},{'app_id': 1030, 'name': JKL, 'state': 0}]

这就是我尝试过的,看起来这种方法是错误的

for key in l1:
    temp=key['app_id']
    for keynd in l2:
        if keynd[app_id]==temp:
            l3.append(keynd['name'])

有人能帮我解决这个问题吗


Tags: keynameidappl1列表forjkl
3条回答

您的问题目前不明确:

  • 如何处理l2中不存在的l1元素?我假定你不理他们
  • 如何处理l1中不存在的l2元素?我假定你不理他们
  • 如果来自l1的应用程序id在l2中出现多次,该怎么办?我将假设使用任何一个,并将使用最后一个

搜索dict通常比迭代列表快,因此我将构建一个辅助映射app_id=>^从l2生成{},并构建只包含{}中存在的app_idl1副本,然后从辅助映射中追加名称:

aux = {it['app_id']: it['name'] for it in l2}
l3 = [it.copy() for it in l1 if it['app_id'] in aux]
for it in l3:
    it['name'] = aux[it['app_id']]

它给出for l3:[{'app_id': 9833, 'state': 0, 'name': 'ABC'}, {'app_id': 1036, 'state': 1, 'name': 'CDE'}, {'app_id': 1039, 'state': 0, 'name': 'XYZ'}, {'app_id': 1030, 'state': 0, 'name': 'JKL'}],而不需要嵌套循环

我假设名称也是字符串。 这应该起作用:

l1 = [{'app_id': 9833, 'state': 0}, {'app_id': 1036, 'state': 1}, {'app_id': 1039, 'state': 0},{'app_id': 1030, 'state': 0}]
l2 = [{'app_id': 9833, 'name': 'ABC'}, {'app_id': 1036, 'name': 'CDE'}, {'app_id': 1039, 'name': 'XYZ'}, {'app_id': 1030, 'name': 'JKL'}]
l3 = []

for i in range(len(l1)):
    if l1[i]['app_id'] == l2[i]['app_id']:
        l3.append({'app_id': l1[i]['app_id'], 'name': l2[i]['name'], 'state': l1[i]['state']})

print(l3)

替代解决方案:使用dataframe合并它们:

import pandas as pd
l1 = [{'app_id': 9833, 'state': 0}, {'app_id': 1036, 'state': 1}, {'app_id': 1039, 'state': 0},{'app_id': 1030, 'state': 0}]
l2 = [{'app_id': 9833, 'name': 'ABC'}, {'app_id': 1036, 'name': 'CDE'}, {'app_id': 1039, 'name': 'XYZ'},{'app_id': 1030, 'name': 'JKL'}]
L1 = pd.DataFrame(l1)
L2 = pd.DataFrame(l2)
print(pd.merge(L1, L2, on = 'app_id').to_dict(orient = 'records'))

输出:

[{'app_id': 9833, 'name': 'ABC', 'state': 0},
 {'app_id': 1036, 'name': 'CDE', 'state': 1},
 {'app_id': 1039, 'name': 'XYZ', 'state': 0},
 {'app_id': 1030, 'name': 'JKL', 'state': 0}]

相关问题 更多 >

    热门问题