如何编写Python函数实现二级嵌套字典ID与IS标签的匹配标注
问题描述
我有一组带索引(Index)和ID的数据,示例如下:
Index ID 20613 0007650087 20614 00B64L8R37 20615 00B46FK959 20616 00B1KHKN05 20617 0008377250 20618 0001013456 20619 0001012268 20620 00B1KHLW60 20621 0006074909
同时还有一个IS标签与组合ID映射的字典,示例如下:
IS Label Combined IDs IS_1 --> ['0007650087', '00B64L8R37'] IS_2 --> ['0006074909', '00B1KHKN05'] IS_3 --> ['0006074909', '0001012267'] IS_4 --> ['0006074903', '0006074902', '0006074901'] IS_n.... ['m'...]
需要编写一个Python函数,遍历上述数据中的每个ID,匹配对应的IS标签(比如索引20613和20614对应IS_1),并且支持一个ID匹配多个IS标签的场景。目前我写的函数只能做精确匹配,无法满足需求,期望实现的输出效果如下:
Index ID IS Label 20613 0007650087 IS_1 20614 00B64L8R37 IS_1 20615 00B46FK959 20616 00B1KHKN05 IS_2 20617 0008377250 20618 0001013456 20619 0001012268 20620 00B1KHLW60 20621 0006074909 IS_2
解决方案
步骤1:构建反向映射字典
为了高效匹配,先把IS标签的组合ID列表转换成ID到对应IS标签列表的反向字典,这样可以直接通过ID快速查找到所有关联的IS标签,避免每次遍历整个组合字典。
步骤2:编写匹配函数
遍历原始数据中的每个ID,通过反向字典查找对应的IS标签,支持多标签场景(用逗号分隔或保留列表形式)。
完整代码示例
def map_ids_to_is_labels(original_data, is_label_mapping): # 构建反向映射:ID -> [对应的IS标签列表] id_to_is = {} for is_label, ids in is_label_mapping.items(): for id_val in ids: if id_val not in id_to_is: id_to_is[id_val] = [] id_to_is[id_val].append(is_label) # 遍历原始数据,添加IS标签 result = [] for index, id_val in original_data.items(): # 获取对应的IS标签,没有则为空字符串 is_labels = id_to_is.get(id_val, []) is_label_str = ', '.join(is_labels) if is_labels else '' result.append({ 'Index': index, 'ID': id_val, 'IS Label': is_label_str }) return result # 示例数据(模拟二级嵌套字典的核心结构,可根据实际嵌套层级调整) original_data = { 20613: '0007650087', 20614: '00B64L8R37', 20615: '00B46FK959', 20616: '00B1KHKN05', 20617: '0008377250', 20618: '0001013456', 20619: '0001012268', 20620: '00B1KHLW60', 20621: '0006074909' } is_label_mapping = { 'IS_1': ['0007650087', '00B64L8R37'], 'IS_2': ['0006074909', '00B1KHKN05'], 'IS_3': ['0006074909', '0001012267'], 'IS_4': ['0006074903', '0006074902', '0006074901'] } # 调用函数并格式化打印结果 output = map_ids_to_is_labels(original_data, is_label_mapping) print(f"{'Index':<8} {'ID':<15} {'IS Label'}") for item in output: print(f"{item['Index']:<8} {item['ID']:<15} {item['IS Label']}")
代码解释
- 反向映射构建:遍历IS标签字典,将每个ID关联到对应的所有IS标签,查找时间复杂度从O(n)降到O(1),大幅提升匹配效率。
- 多标签支持:如果一个ID匹配多个IS标签(比如示例中的
0006074909会匹配IS_2和IS_3),会自动将所有标签用逗号分隔显示。 - 结构适配性:示例中简化了原始数据的结构,若实际是二级嵌套字典,只需调整遍历
original_data的逻辑即可(比如先遍历外层键,再提取内层的ID值)。
运行结果
运行上述代码后,输出如下(注意0006074909会显示两个关联标签):
Index ID IS Label 20613 0007650087 IS_1 20614 00B64L8R37 IS_1 20615 00B46FK959 20616 00B1KHKN05 IS_2 20617 0008377250 20618 0001013456 20619 0001012268 20620 00B1KHLW60 20621 0006074909 IS_2, IS_3
内容的提问来源于stack exchange,提问作者Andres Mallcott
相关产品推荐
相关产品推荐

