根据匹配的多个键值对将字典组合到列表中



我是python的新手,我试着在谷歌上找到这个非常类似于我的情况:根据匹配的键:值对在字典列表中组合字典,但在我的情况下,假设我有一个如下列表:

[{'entity': 'Mechanical properties',
'offsetstart': 0,
'offsetend': 21,
'id': 'c_4683'},
{'entity': 'properties',
'offsetstart': 11,
'offsetend': 21,
'id': 'c_49874'},
{'entity': 'properties',
'offsetstart': 11,
'offsetend': 21,
'id': 'c_13609'},
{'entity': 'wood',
'offsetstart': 33,
'offsetend': 37,
'id': 'c_8421'}]

如何组合键"id"当匹配多个键值对时(即键"entity"、"offsetstart"one_answers"offsetend"的值)

所以我可以得到想要的结果如下:

[{'entity': 'Mechanical properties',
'offsetstart': 0,
'offsetend': 21,
'id': 'c_4683'},
{'entity': 'properties',
'offsetstart': 11,
'offsetend': 21,
'id': ['c_49874', 'c_13609']},
{'entity': 'wood',
'offsetstart': 33,
'offsetend': 37,
'id': 'c_8421'}]

非常感谢你的帮助!

output_list = []
for entity_dict in initial_list:
current_entity = entity_dict['entity']
entity_dict['id'] = [entity_dict['id']] #Change string to list type
for output_dict in output_list: # Check if same entity was catched
if output_dict['entity'] == current_entity:
output_dict['id'] += entity_dict['id']
break
else:  # Executed if break not found. In this case is the first entity of his type
output_list.append(entity_dict)
print(output_list)

[{'entity': 'Mechanical properties', 'offsetstart': 0, 'offsetend': 21, 'id': ['c_4683']}, {'entity': 'properties', 'offsetstart': 11, 'offsetend': 21, 'id': ['c_49874', 'c_13609']}, {'entity': 'wood', 'offsetstart': 33, 'offsetend': 37, 'id': ['c_8421']}]

我建议您将输入列表更改为使用实体作为键的字典。一般来说,字典列表不是一个好主意。

我建议您使用列表或字符串作为'id'字段的值。即使只有一个id,也要使用包含一个元素的列表。混合这两种数据结构是不一致的,可能会导致bug(字符串和列表都是可迭代的)。

解决方案(data是您的字典列表):

ID_KEY = 'id'
tmp = {}
for d in data:
fields = d['entity'], d['offsetstart'], d['offsetend']
id_ = d[ID_KEY]
if fields in tmp:
tmp[fields][ID_KEY].append(id_)
else:        
d_copy = d.copy()
d_copy[ID_KEY] = [id_]
tmp[fields] = d_copy        

result = list(tmp.values())

输出:

>>> result
[{'entity': 'Mechanical properties',
'offsetstart': 0,
'offsetend': 21,
'id': ['c_4683']},
{'entity': 'properties',
'offsetstart': 11,
'offsetend': 21,
'id': ['c_49874', 'c_13609']},
{'entity': 'wood', 'offsetstart': 33, 'offsetend': 37, 'id': ['c_8421']}]

解决方案:

  • 迭代数据中的每个项。
  • 获取"entity"、"offsetstart"、"offsetend"的值,作为字典的键。它的值将是id的列表。
  • 对于每个匹配这些值的项,附加id。请注意,由于我们使用的是字典(这是一个哈希表),那么这将只是一个常数O(1)的时间复杂度。
  • 重建字典
from collections import defaultdict
data = [
{'entity': 'Mechanical properties',
'offsetstart': 0,
'offsetend': 21,
'id': 'c_4683'},
{'entity': 'properties',
'offsetstart': 11,
'offsetend': 21,
'id': 'c_49874'},
{'entity': 'properties',
'offsetstart': 11,
'offsetend': 21,
'id': 'c_13609'},
{'entity': 'wood',
'offsetstart': 33,
'offsetend': 37,
'id': 'c_8421'}
]
data_groups = defaultdict(list)
for record in data:
record_id = record.pop('id')
record_attrs = tuple(sorted(record.items()))
data_groups[record_attrs].append(record_id)
data_result = []
for a, b in data_groups.items():
data_result.append(dict([*a, ("id", b)]))
print(data_result)

输出(漂亮的打印)

[
{'entity': 'Mechanical properties', 'offsetend': 21, 'offsetstart': 0, 'id': ['c_4683']},
{'entity': 'properties', 'offsetend': 21, 'offsetstart': 11, 'id': ['c_49874', 'c_13609']},
{'entity': 'wood', 'offsetend': 37, 'offsetstart': 33, 'id': ['c_8421']}
]

最新更新