【发布时间】:2020-06-04 15:35:11
【问题描述】:
我知道有一百万个这样的问题,我只是找不到适合我的答案。
我有这个:
list1 = [{'assembly_id': '1', 'asym_id_list': ['A', 'B', 'E', 'G', 'H']}, {'assembly_id': '1', 'asym_id_list': ['C', 'D', 'F', 'I', 'J']}, {'assembly_id':2,'asym_id_list':['D,C'],'auth_id_list':['C','V']}]
如果 assembly_ids 相同,我想在 dict 中组合其他相同的键。
在这个例子中,assembly_id 1 出现了两次,所以上面的输入会变成:
[{'assembly_id': '1', 'asym_id_list': ['A', 'B', 'E', 'G', 'H','C', 'D', 'F', 'I', 'J']},{'assembly_id':2,'asym_id_list:['D,C'],'auth_id_list':['C','V']}]
理论上可以有 n 个 assembly_id(即,程序集 1 可能出现在 dict 中 10 或 20 次,而不仅仅是 2 次),并且最多可以有两个其他列表(asym_id_list 和 auth_id_list)。
我在看这个方法:
new_dict = {}
assembly_list = [] #to keep track of assemblies already seen
for dict_name in list1: #for each dict in the list
if dict_name['assembly_id'] not in assembly_list: #if the assembly id is new
new_dict['assembly_id'] = dict_name #this line is wrong, add the entry to new_dict
assembly_list.append(new_dict['assembly_id']) #append the id to 'assembly_list'
else:
new_dict['assembly_id'].append(dict_name) #else if it's already seen, append the dictionaries together, this is wrong
print(new_dict)
输出错误:
{'assembly_id': {'assembly_id': 2, 'asym_id_list': ['D,C'], 'auth_id_list': ['C', 'V']}}
但我认为这个想法是对的,我应该打开一个新列表和字典,如果以前没有见过,追加;而如果它以前见过......结合?但这只是我没有得到的细节?
【问题讨论】:
-
重新考虑最外层的循环:您想要返回一个字典列表。然后,您可以将
dict_name附加到该列表中,如果之前没有看到过dict_name['assembly_list'],您可以添加列表'asym_id_list'和'auth_id_list'如果之前看到过。 -
我认为您的示例数据中有几个拼写错误。我认为您的意思是
'assembly_id':2,'asym_id_list':['D,C']中的'D,C' 是这样的单独字符串:'assembly_id':2,'asym_id_list':['D', 'C']。同样在“assembly_id”键中,您可以混合使用字符串和整数(即'1'和2)。尽管这会起作用,但我猜您并不打算将密钥混合为ints 和strings
标签: python dictionary merge