如何匹配双列表元素生成结构化新列表并格式化字符串输出?
解决方案
问题回顾
给定列表:
A_list = ['A', 'A', 'B', ['C', 'D'] ] B_list = ['A1', 'W5', 'X6', 'A2', 'A3', 'T5', 'B0', 'Z9', 'C1', 'W3', 'D1'] C_list = [] string_list = ["{0} in Alpha", "{0} in Apple", "{0} in Bee", "{0} in Cheese and {1} in Dice"]
需要完成两个核心任务:
- 生成与
A_list结构一致的C_list,其中每个元素是B_list中对应前缀的匹配项 - 用
string_list的模板结合C_list生成格式化输出
步骤1:构建高效的前缀映射
先把B_list中的元素按前缀(第一个字符)分组,避免重复遍历查找,提升效率:
from collections import defaultdict # 构建前缀到对应元素列表的映射 prefix_map = defaultdict(list) for item in B_list: prefix = item[0] prefix_map[prefix].append(item)
步骤2:递归生成结构一致的C_list
通过递归处理A_list的嵌套结构,逐个匹配并取出对应元素:
def process_item(a_item, prefix_map): if isinstance(a_item, list): # 递归处理子列表中的每个元素 return [process_item(sub, prefix_map) for sub in a_item] else: # 取出对应前缀的第一个可用元素(pop(0)保证按B_list中的顺序匹配) return prefix_map[a_item].pop(0) # 生成目标C_list C_list = [] for item in A_list: result = process_item(item, prefix_map) C_list.append(result)
执行后C_list的结果为:['A1', 'A2', 'A3', 'B0', ['C1', 'D1']],完全符合结构要求。
步骤3:生成格式化字符串输出
根据string_list的模板,结合C_list的元素逐一格式化:
# 生成输出列表 formatted_output = [] # 处理前三个单元素模板 for idx in range(3): formatted_output.append(string_list[idx].format(C_list[idx])) # 处理第四个嵌套元素的模板(用*解包子列表) formatted_output.append(string_list[3].format(*C_list[3])) # 打印结果 for line in formatted_output: print(line)
最终输出:
A1 in Alpha A2 in Apple A3 in Bee C1 in Cheese and D1 in Dice
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

