如何移除字符串列表中以其他现有单字字符串为后缀的组合字符串?
问题分析与解决方案
原代码循环卡死的原因
你的第二个循环逻辑完全错误,直接导致无限循环:
- 你在遍历
new_list的同时,不断往new_list里追加元素i,这会让new_list长度持续增长,外层的for i in new_list永远无法遍历结束,最终因运行时间过长被终止。 contains_word的判断逻辑搞反了,你应该检查组合字符串的最后一个词是否属于单字词集合,而非用单字词去匹配组合字符串。- 用
set处理remain_list还会打乱原列表顺序,这大概率不是你想要的结果。
可行解决方案
先明确需求:保留单字词,以及最后一个词不是列表内单字词的组合字符串;移除最后一个词是列表内现有单字词的组合字符串。
步骤拆解
- 提取列表中所有单字词,存入集合(集合的查找效率远高于列表)。
- 遍历原列表,对每个元素做判断:
- 若是单字词,直接保留;
- 若是多字词,拆分出最后一个词,检查它是否在单字词集合里:不在则保留,在则移除。
代码实现
ex_list = ['transport truck', 'truck', 'plastic boat', 'boat', 'transport', 'ferry', 'truck parking', 'pickup truck', 'pickup'] # 提取所有单字词,存入集合用于快速查找 single_words = {word for word in ex_list if len(word.split()) == 1} new_list = [] for item in ex_list: parts = item.split() if len(parts) == 1: # 单字词直接保留 new_list.append(item) else: # 多字词,检查最后一个词是否不在单字词集合中 last_word = parts[-1] if last_word not in single_words: new_list.append(item) print(new_list)
输出结果
['truck', 'boat', 'transport', 'ferry', 'truck parking', 'pickup']
这个方案逻辑准确,时间复杂度为O(n)(n为列表长度),运行效率高,不会出现循环卡死的问题。
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

