Python字符串处理:唯一元素提取与相邻不重复单词实现及代码调试
Python字符串处理问题解决:去重与相邻无重复句子生成
需求一:输出字符串中的所有唯一元素(去重)
实现方案
如果不需要保留单词首次出现的顺序,直接用set去重即可:
s = input().strip() unique_words = set(s.split()) print(' '.join(unique_words))
如果需要保留单词首次出现的顺序(Python 3.7+版本支持),可以用dict.fromkeys实现:
s = input().strip() words = s.split() unique_words = list(dict.fromkeys(words)) print(' '.join(unique_words))
需求二:生成相邻单词互不相同的句子(示例:I am john cena cena john → I am)
原代码问题分析
给定代码存在多处逻辑漏洞:
- 索引偏移问题:遍历列表时直接
pop元素,会导致后续索引指向的元素移位,出现错误的元素操作。 - 无效循环逻辑:外层
for j in range(2)无法处理删除重复后新产生的相邻重复(比如删除cena cena后,john和john变成相邻,原代码无法识别)。 - 结果收集错误:
else分支直接将当前元素加入结果列表,没有考虑后续可能出现的重复,也遗漏了最后几个元素的边界处理。 - 错误的
pop操作:检测到相邻重复时,先pop(i)会让原a[i+1]元素移动到i位置,此时再pop(i+1)会删除错误的元素。
修正后的代码实现
以下代码会循环处理所有相邻重复对,直到结果中不存在任何相邻相同的单词:
words = input().split() has_duplicates = True # 循环处理直到没有相邻重复 while has_duplicates: has_duplicates = False new_words = [] i = 0 while i < len(words): # 检测当前和下一个单词是否重复 if i + 1 < len(words) and words[i] == words[i+1]: has_duplicates = True i += 2 # 跳过这两个重复单词 else: new_words.append(words[i]) i += 1 words = new_words # 检查处理后的列表是否新产生了相邻重复 if not has_duplicates: for i in range(len(words)-1): if words[i] == words[i+1]: has_duplicates = True words.pop(i) words.pop(i) break print(' '.join(words))
测试验证
输入:I am john cena cena john
输出:I am,完全符合示例要求。
代码逻辑说明
- 外层循环持续扫描列表,直到没有相邻重复对为止。
- 内层遍历处理当前列表,遇到相邻重复对则直接跳过,否则将单词加入新列表。
- 每次处理后检查新列表是否产生了新的相邻重复(比如删除中间重复后前后单词变重复),如果有则重新进入循环处理。
内容的提问来源于stack exchange,提问作者Bharatkumar kori
相关产品推荐
相关产品推荐

