如何高效将Python二维列表元素替换为相邻字母对求和值
解决二维字符串列表相邻字母对价值求和问题
问题背景
给定二维字符串列表lst2和存储相邻字母对价值的矩阵value_matrix,需要将lst2中每个字符串替换为其所有相邻字母对的价值之和。
输入示例:
lst2 = [['acba', 'ca'], ['babab', 'ca', 'bc']] value_matrix = [['aa', 0], ['ab', 3], ['ac', 5], ['ba', 2], ['bb', 0], ['bc', 9], ['ca', 7], ['cb', 4], ['cc', 0]]
预期输出:
new_lst2 = [[11, 7], [10, 7, 9]]
解决方案
核心思路是先将价值矩阵转换为字典(实现快速查找),再遍历每个字符串计算相邻对的价值总和,最后用嵌套列表推导式生成结果。
步骤1:将价值矩阵转为字典
把value_matrix转换成键为字母对、值为对应分数的字典,这样查找字母对价值的时间复杂度为O(1),远优于遍历列表的方式。
value_dict = {pair: score for pair, score in value_matrix}
步骤2:编写单个字符串的求和函数
对给定字符串,遍历所有相邻字符对并累加对应价值:
def calculate_pair_sum(s): total = 0 # 遍历从第0个到倒数第2个字符,取当前字符与下一个字符组成对 for i in range(len(s) - 1): pair = s[i] + s[i+1] total += value_dict[pair] return total
步骤3:生成结果列表
用嵌套列表推导式遍历原二维列表,对每个字符串应用求和函数:
new_lst2 = [[calculate_pair_sum(s) for s in sublist] for sublist in lst2]
完整代码及验证
整合所有部分后运行,即可得到预期结果:
lst2 = [['acba', 'ca'], ['babab', 'ca', 'bc']] value_matrix = [['aa', 0], ['ab', 3], ['ac', 5], ['ba', 2], ['bb', 0], ['bc', 9], ['ca', 7], ['cb', 4], ['cc', 0]] # 转换为字典 value_dict = {pair: score for pair, score in value_matrix} def calculate_pair_sum(s): total = 0 for i in range(len(s) - 1): pair = s[i] + s[i+1] total += value_dict[pair] return total # 生成结果 new_lst2 = [[calculate_pair_sum(s) for s in sublist] for sublist in lst2] print(new_lst2) # 输出: [[11, 7], [10, 7, 9]]
关键细节说明
- 字典转换:利用Python字典推导式快速完成矩阵到字典的映射,避免重复遍历
value_matrix。 - 相邻对遍历:长度为n的字符串有n-1个相邻字符对,因此循环范围设为
len(s)-1。 - 嵌套列表推导式:用简洁的语法替代多层for循环,高效完成二维列表的转换。
内容的提问来源于stack exchange,提问作者user109387
相关产品推荐
相关产品推荐

