如何将两个不同长度的元组列表合并转换为指定格式字典列表
实现方案
核心思路是先为a列表的int关联id构建索引字典,避免嵌套循环带来的额外性能开销,再遍历b列表直接匹配对应字段即可,具体实现如下:
- 首先构建id到属性的映射字典
# a中每个元组的第2位(下标1)为关联id,映射后可直接O(1)时间查询对应属性 id_map = {item[1]: {"type": item[0], "name": item[2]} for item in a}
- 遍历b列表生成目标结果
result = [] # b中每个元组结构为 主语id、谓词、宾语id,直接从映射字典取值拼接即可 for s_id, predicate, o_id in b: result.append({ "s_type": id_map[s_id]["type"], "s": id_map[s_id]["name"], "predicate": predicate, "o_type": id_map[o_id]["type"], "o": id_map[o_id]["name"] })
测试验证
用给出的示例数据测试,代码如下:
a = [('NC', 0, 'Eyes'),('NC', 3, 'organs'),('NC', 19, 'neurons')] b = [(0, 'Hypernym', 3),(19, 'Holonym', 0)] id_map = {item[1]: {"type": item[0], "name": item[2]} for item in a} result = [] for s_id, predicate, o_id in b: result.append({ "s_type": id_map[s_id]["type"], "s": id_map[s_id]["name"], "predicate": predicate, "o_type": id_map[o_id]["type"], "o": id_map[o_id]["name"] }) print(result)
输出结果完全符合预期:
[ {'s_type': 'NC', 's': 'Eyes', 'predicate': 'Hypernym', 'o_type': 'NC', 'o': 'organs'}, {'s_type': 'NC', 's': 'neurons', 'predicate': 'Holonym', 'o_type': 'NC', 'o': 'Eyes'} ]
补充说明
如果实际数据中存在b里的id不在a的映射字典中的情况,可以提前加判断过滤异常数据,避免抛出KeyError。
内容的提问来源于stack exchange,提问作者Wen Ma
相关产品推荐
相关产品推荐

