Python字符串列表处理:如何修复删除子串后缀代码输出错误问题
代码问题及修复方案
现有代码的核心问题
- 未处理无空格字符串:类似
bedroom、cosmoliving这类不含空格的字符串调用split(' ',1)[1]会触发索引越界,这类字符串本身没有可拆分的前后缀,应该直接保留。 - 缺少前缀匹配校验:没有校验两个字符串的前缀是否完全一致,直接交叉匹配所有字符串的后缀,导致出现
bed frame被错误处理成frame的问题。 - 匹配逻辑错误:你的逻辑是只要当前后缀是其他字符串后缀的子串就替换成其他完整字符串,但实际上应该是同前缀前提下,当前字符串的后缀是其他同前缀字符串后缀的前缀子串,才需要做截断处理。
- 变量作用域和缩进错误:
corrected.append(joining)的缩进位置错误,且没有初始化joining的默认值,未匹配到规则的字符串会错误使用上一轮循环的旧值。
修复后的代码
def xyz(uncorrected): corrected = [] for words in uncorrected: # 无空格字符串直接保留 if ' ' not in words: corrected.append(words) continue # 仅拆分一次得到前缀、当前后缀 prefix, cur_suffix = words.split(' ', 1) res = words # 收集所有同前缀的其他字符串的后缀 same_prefix_suffixes = [] for keyword in uncorrected: if ' ' not in keyword: continue k_prefix, k_suffix = keyword.split(' ', 1) if k_prefix == prefix and k_suffix != cur_suffix: same_prefix_suffixes.append(k_suffix) # 匹配规则校验 for s in same_prefix_suffixes: if s.startswith(cur_suffix): if ' ' in cur_suffix: # 当前后缀本身带空格,截断到上一级 res = ' '.join(words.split(' ')[:-1]) else: # 单级后缀匹配成功,仅保留前缀 res = prefix break corrected.append(res) return corrected # 测试 lst = ['bed frame', 'queen bed', 'queen bedding', 'queen bed frame', 'queen bedroom', 'bedroom', 'queen b', 'queen be', 'queen bed fra', 'queen bed fr', 'bed frame queen', 'bedroom furniture', 'queen bed fram', 'queen bed f', 'queen frame', 'queen m', 'queen ma', 'bed queen', 'queen s', 'cosmoliving'] print(xyz(lst))
运行后输出结果和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者Prakket
相关产品推荐
相关产品推荐

