You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

原代码问题分析

给定代码存在多处逻辑漏洞:

  1. 索引偏移问题:遍历列表时直接pop元素,会导致后续索引指向的元素移位,出现错误的元素操作。
  2. 无效循环逻辑:外层for j in range(2)无法处理删除重复后新产生的相邻重复(比如删除cena cena后,john和john变成相邻,原代码无法识别)。
  3. 结果收集错误:else分支直接将当前元素加入结果列表,没有考虑后续可能出现的重复,也遗漏了最后几个元素的边界处理。
  4. 错误的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,完全符合示例要求。

代码逻辑说明

  1. 外层循环持续扫描列表,直到没有相邻重复对为止。
  2. 内层遍历处理当前列表,遇到相邻重复对则直接跳过,否则将单词加入新列表。
  3. 每次处理后检查新列表是否产生了新的相邻重复(比如删除中间重复后前后单词变重复),如果有则重新进入循环处理。

内容的提问来源于stack exchange,提问作者Bharatkumar kori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:32