基于前后元素值修改Python字典中特定OTHER标签为DCCNP
问题描述
给定如下Python字典:
ip_dict = {'GLArch': {'GLArch-0.png': ['OTHER', 'Figure 28 TAC '], 'GLArch-1.png': ['DCDFP', 'This insurance '], 'GLArch-2.png': ['DCDNP', 'Item 3'], 'GLArch-3.png': ['OTHER', 'SCHEDULE OF'], 'GLArch-4.png': ['OTHER', 'SCHEDULEed OF3'], 'GLArch-5.png': ['DCCFP', 'COMMERCIAL GENERAL'], 'GLArch-6.png': ['OTHER', 'a The'], 'GLArch-7.png': ['OTHER', 'c Such attorney'], 'GLArch-8.png': ['DCCNP', '2 To any'], 'GLArch-9.png': ['OTHER', 'e as part'], 'GLArch-10.png': ['OTHER', '1 A watercraft'], 'GLArch-11.png': ['OTHER', '5 That particular'], 'GLArch-12.png': ['DCCNP', 'Damages claimed'], 'GLArch-13.png': ['OTHER', 'resulting from the'], 'GLArch-14.png': ['DCCNP', 'processing or packaging'], 'GLArch-15.png': ['DCCNP', 's. Fungi'], 'GLArch-16.png': ['OTHER', '1 the actual'], 'GLArch-17.png': ['OTHER', '5 6 9 10 11']}}
需求规则
- 若一个或多个
OTHER出现在DCCFP与DCCNP之间,或出现在两个DCCNP之间,则将这些OTHER重命名为DCCNP - 示例:GLArch-6/7.png(DCCFP与DCCNP之间的OTHER)、GLArch-9/10/11.png(两个DCCNP之间的OTHER)、GLArch-13.png(两个DCCNP之间的OTHER)都需要替换为DCCNP
预期输出字典
op_dict = {'GLArch': {'GLArch-0.png': ['OTHER', 'Figure 28 TAC '], 'GLArch-1.png': ['DCDFP', 'This insurance '], 'GLArch-2.png': ['DCDNP', 'Item 3'], 'GLArch-3.png': ['OTHER', 'SCHEDULE OF'], 'GLArch-4.png': ['OTHER', 'SCHEDULEed OF3'], 'GLArch-5.png': ['DCCFP', 'COMMERCIAL GENERAL'], 'GLArch-6.png': ['DCCNP', 'a The'], 'GLArch-7.png': ['DCCNP', 'c Such attorney'], 'GLArch-8.png': ['DCCNP', '2 To any'], 'GLArch-9.png': ['DCCNP', 'e as part'], 'GLArch-10.png': ['DCCNP', '1 A watercraft'], 'GLArch-11.png': ['DCCNP', '5 That particular'], 'GLArch-12.png': ['DCCNP', 'Damages claimed'], 'GLArch-13.png': ['DCCNP', 'resulting from the'], 'GLArch-14.png': ['DCCNP', 'processing or packaging'], 'GLArch-15.png': ['DCCNP', 's. Fungi'], 'GLArch-16.png': ['OTHER', '1 the actual'], 'GLArch-17.png': ['OTHER', '5 6 9 10 11']}}
尝试的错误代码
def process_dict(ip_dict): op_dict = {} for key, value in ip_dict.items(): op_dict[key] = {} prev_val = None for k, v in value.items(): if prev_val is not None and ("DCCFP" in prev_val and "DCCNP" in v[0]): op_dict[key][k] = ["DCCFP", v[1]] else: op_dict[key][k] = v prev_val = v[0] return op_dict
修正后的代码
def process_dict(ip_dict): op_dict = {} for top_key, sub_dict in ip_dict.items(): op_dict[top_key] = {} replace_other = False # 标记是否需要将OTHER替换为DCCNP for img_key, [category, text] in sub_dict.items(): if category == "DCCFP": # 遇到DCCFP,开启替换状态,后续OTHER直到DCCNP都要替换 replace_other = True op_dict[top_key][img_key] = [category, text] elif category == "DCCNP": # 遇到DCCNP,保留原类别,且保持替换状态(后续OTHER在两个DCCNP之间也要替换) op_dict[top_key][img_key] = [category, text] replace_other = True elif category == "OTHER" and replace_other: # 在替换状态下的OTHER,替换为DCCNP op_dict[top_key][img_key] = ["DCCNP", text] else: # 其他情况:非目标区间的OTHER,或其他类别,关闭替换状态并保留原内容 op_dict[top_key][img_key] = [category, text] replace_other = False return op_dict
代码说明
核心思路是通过状态跟踪来判断是否需要替换OTHER:
- 用
replace_other变量标记当前是否处于需要替换的区间 - 遇到
DCCFP时开启替换状态,因为后续的OTHER直到下一个DCCNP都属于目标区间 - 遇到
DCCNP时,既保留自身类别,又保持替换状态(因为后续的OTHER会处于两个DCCNP之间) - 遇到非目标类别(如
DCDFP、DCDNP)或不在替换区间的OTHER时,关闭替换状态并保留原内容 - 严格按字典条目顺序处理(Python 3.7+字典默认保留插入顺序,符合需求)
测试验证:运行修正后的函数,返回结果与预期输出完全一致。
内容的提问来源于stack exchange,提问作者spectre
相关产品推荐
相关产品推荐

