如何按规则拼接两个列表字符串值,生成与目标列表长度一致的结果?
按部分匹配拼接列表并处理无匹配项
问题需求
需要合并两个列表,通过前缀部分匹配拼接元素:
- 以
list2的每个元素为基准,在list1中找到前缀匹配的项,提取其三位小数部分拼接 - 最终列表必须包含
list2所有元素,长度与list2完全一致 - 无匹配项时自动补充
.000
现有实现问题
现有代码:
list1 = ["15:09.123", "15:09.234", "15:09.522", "15:09.621", "15:10.123", "15:11.123", "15:12.123", "15:12.987"] list2 = ["15:09", "15:09", "15:10", "15:14"] final = [] for each in list2: for each1 in list1: if each in each1: eachtemp = each1.split(".")[1] final.append(each+"."+eachtemp) list1.remove(each1) print(final)
当前输出:
['15:09.123', '15:09.522', '15:09.234', '15:10.123']
核心问题:
- 遍历
list1时直接修改原列表,导致迭代器跳过元素(比如15:09.234被跳过,优先匹配到了15:09.522) - 未处理
list2中无匹配的元素(如15:14) - 输出顺序和长度不符合预期
期望输出
['15:09.123', '15:09.234', '15:10.123', '15:14.000']
解决方案
先将list1按前缀分组存储,再遍历list2依次提取匹配项,无匹配时补充默认值:
from collections import defaultdict list1 = ["15:09.123", "15:09.234", "15:09.522", "15:09.621", "15:10.123", "15:11.123", "15:12.123", "15:12.987"] list2 = ["15:09", "15:09", "15:10", "15:14"] # 构建前缀到小数部分的映射,保留原list1的顺序 prefix_map = defaultdict(list) for item in list1: prefix, decimal = item.split(".") prefix_map[prefix].append(decimal) final = [] for prefix in list2: # 取出对应前缀的第一个小数部分,无匹配则用000 if prefix_map[prefix]: final.append(f"{prefix}.{prefix_map[prefix].pop(0)}") else: final.append(f"{prefix}.000") print(final)
运行结果:
['15:09.123', '15:09.234', '15:10.123', '15:14.000']
代码说明
- 用
defaultdict分组存储每个前缀对应的小数部分,确保保留list1中的原始顺序 - 遍历
list2时,从对应前缀的列表中取出第一个元素,避免迭代修改原列表导致的跳序问题 - 无匹配项时自动补充
.000,严格保证最终列表长度与list2一致
内容的提问来源于stack exchange,提问作者Gravity Mass
相关产品推荐
相关产品推荐

