如果所有元素都存在,则在dict中追加所有值并删除重复项

2024-05-23 18:37:22 发布

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

我有一个场景,我有三个字典,我想合并成一个,但条件是当我将这三个字典与键name进行比较时,如果有重复的字典需要删除它们

以下是我尝试过的:

dict1= {'d1': [{'name': 'app1', 'id': 7134}, {'name': 'app2', 'id': 242}, {'name': 'yest app', 'id': 67},{'name': 'abc jam app', 'id': 6098}]}

dict2= {'d2': [{'name': 'app1 ', 'id': 30}, {'name': 'app2', 'id': 82}, {'name': 'yest app', 'id': 17}]}

dict3= {'d3': [{'name': 'app1', 'id': 70}, {'name': 'app2', 'id': 2582},{'name': 'availabla2z', 'id': 6667}]}

dict2 = {i:j for i,j in dict2.items() if i not in dict1}
dict3 = {i:j for i,j in dict3.items() if i not in dict2}

但同样的,我也不知道如何比较这三种格言。 因为如果你看数据dict1有一个元素'name': 'app1',其中相同的元素在dict2中,像这样'name': 'app1 '(有一个空格),你不知道如何格式化它,并得到下面这样的最终结果

{'final': [{'name': 'app1 ', 'id': 30}, {'name': 'app2', 'id': 82}, {'name': 'yest app', 'id': 17},{'name': 'abc jam app', 'id': 6098},{'name': 'availabla2z', 'id': 6667}]}

Tags: nameinidappfor字典abcjam
3条回答

您可以使用defaultdict通过name将所有词典分组在一起:

from collections import defaultdict

d = defaultdict(list)
for lst in (dict1.values(), dict2.values(), dict3.values()):
    for sublst in lst:
        for dic in sublst:
            d[dic["name"].strip()].append(dic)

然后使用min()选择具有最小id值的词典。这仍然适用于需求,因为它仍然选择一个字典并匹配请求的输出

from operator import itemgetter

result = {'field': [min(x, key=itemgetter('id')) for x in d.values()]}

print(result)

输出:

{'field': [{'name': 'app1', 'id': 30}, {'name': 'app2', 'id': 82}, {'name': 'yest app', 'id': 17}, {'name': 'abc jam app', 'id': 6098}, {'name': 'availabla2z', 'id': 6667}]}

以下是可用的更新程序代码:

dict1= {'d1': [{'name': 'app1', 'id': 7134}, {'name': 'app2', 'id': 242}, {'name': 'yest app', 'id': 67},{'name': 'abc jam app', 'id': 6098}]}
dict2= {'d2': [{'name': 'app1 ', 'id': 30}, {'name': 'app2', 'id': 82}, {'name': 'yest app', 'id': 17}]}
dict3= {'d3': [{'name': 'app1', 'id': 70}, {'name': 'app2', 'id': 2582},{'name': 'availabla2z', 'id': 6667}]}
final = {'final':[]}
for i in dict1['d1']:
    final['final'].append(i)

for k,l in zip(dict3['d3'],range(len(dict1['d1']))):
    if k['name'] == final['final'][l]['name']:
        final['final'][l].update(k)
    else:
        final['final'].append(k)
for j,l in zip(dict2['d2'],range(len(dict1['d1']))):
    if j['name'].strip() == final['final'][l]['name'].strip():
        final['final'][l].update(j)
    else:
        final['final'].append(j)

这使得:

{'final': [{'name': 'app1 ', 'id': 30}, {'name': 'app2', 'id': 82}, {'name': 'yest app', 'id': 17}, {'name': 'abc jam app', 'id': 6098}, {'name': 'availabla2z', 'id': 6667}]}

下面是一个解决方案,它利用了这个other SO answer(对python-2.x替代方案很有用),无需任何特定规则即可删除重复项:

final_dict = dict()
final_dict["final"] = dict1["d1"] + dict2["d2"] + dict3["d3"]
final_dict["final"] = list(
    {v['name'].strip():v for v in final_dict["final"]}.values()
)  # see usage of .strip() to handle space problems you mention

print(final_dict)

结果:

{'final': [
  {'name': 'app1', 'id': 70},
  {'name': 'app2', 'id': 2582},
  {'name': 'yest app', 'id': 17},
  {'name': 'abc jam app', 'id': 6098},
  {'name': 'availabla2z', 'id': 6667}]
}

相关问题 更多 >