如何将嵌套列表中匹配字典键的元素替换为对应字典值?
嵌套列表元素替换问题
需求:将嵌套列表中所有匹配字典键的元素,替换为字典对应的取值(取值为列表时需展开),不匹配的元素保持原样。
原代码问题
原代码存在两个核心问题:
- 对每个元素
k遍历整个字典,无论是否匹配都会执行append,导致不匹配元素被重复添加(字典有3个键,不匹配元素会被添加3次) - 匹配时直接
append字典的列表值,没有将列表展开,不符合预期输出的结构
原代码:
list_1 = [[['bg_en', 'AB2_XY_EN', 'AB2'], ['AB2_MAN']], [['bg_en', 'CD2_XY_EN'], ['CD2_MAN']], [['bg_en', 'AB3_XY_EN'], ['AB3_MAN']]] dict_1 = {'AB2_XY_EN': ['XY_EN ', 'XY_SEL'], 'CD2_XY_EN': ['XY_EN ', 'XY_SEL'], 'AB3_XY_EN': ['XY_EN ', 'XY_SEL']} new_list_1 = [] for i in list_1: sm_list_2 = [] for j in i: sm_list_3 = [] for k in j: for x, y in dict_1.items(): if k == x: sm_list_3.append(y) else: sm_list_3.append(k) sm_list_2.append(sm_list_3) new_list_1.append(sm_list_2) print(new_list_1)
修正后的代码
思路:遍历嵌套列表的每个层级,对每个元素直接检查是否在字典键中,匹配则展开字典值的列表添加到结果,不匹配则直接添加原元素。
list_1 = [[['bg_en', 'AB2_XY_EN', 'AB2'], ['AB2_MAN']], [['bg_en', 'CD2_XY_EN'], ['CD2_MAN']], [['bg_en', 'AB3_XY_EN'], ['AB3_MAN']]] dict_1 = {'AB2_XY_EN': ['XY_EN ', 'XY_SEL'], 'CD2_XY_EN': ['XY_EN ', 'XY_SEL'], 'AB3_XY_EN': ['XY_EN ', 'XY_SEL']} new_list_1 = [] for outer_item in list_1: middle_list = [] for middle_item in outer_item: inner_list = [] for element in middle_item: if element in dict_1: # 展开字典对应的列表值 inner_list.extend(dict_1[element]) else: inner_list.append(element) middle_list.append(inner_list) new_list_1.append(middle_list) print(new_list_1)
输出结果
运行修正后的代码,输出与预期一致:
[[['bg_en', 'XY_EN ', 'XY_SEL', 'AB2'], ['AB2_MAN']], [['bg_en', 'XY_EN ', 'XY_SEL'], ['CD2_MAN']], [['bg_en', 'XY_EN ', 'XY_SEL'], ['AB3_MAN']]]
内容的提问来源于stack exchange,提问作者SG9
相关产品推荐
相关产品推荐

