Python 中替换方法的不同结果

Differect Result with Replace method in Python

上下文: 我正在编写一个程序来查找字符串中的第一个非重复字母。

测试代码 我需要实现以下逻辑:

s = "iiiiiiitya"
if 'i' in s:
    s = s.replace('i','')
print(s)

输出: tya

很好。 它从字符串中删除所有出现的 'i'。 这就是我想要的。

问题: 但是,一旦我开始在我的实际程序中实现相同的逻辑,该功能就不会以相同的方式工作,即它只删除了第一次出现的 perticulare信,因此我的逻辑失败了。

def non_rep(s):
    for el in s:
        if el in s[1:]:
            s = s.replace(el,'')
        else:
            return el
    return "No such case is matched"
str = "adiiiityda"
ch = non_rep(str)
print(ch)

输出: i

预期输出: t

为什么它会以这种方式运行,我尝试了很多次,但它在第一个(测试)代码中的工作方式与它应该的一样,当我将它实现到程序中时,它的运行方式有所不同。

您可以对 Python 中的字符串使用函数计数,如下所示:

def non_rep(s):
    for char in s:
        if s.count(char) == 1:
            return char

以下使用 while 来实现您的想法:

def non_rep(s):
    while s: # while s is non-empty
        el = s[0] # get the first character
        if el in s[1:]: # if the character is found in another place
            s = s.replace(el, '') # remove all of them
        else: # if not repeated
            return s[0] # return that
    return 'No such case is matched' # this is reached when depleted

print(non_rep("adiiiityda")) # t
print(non_rep("aabbcc")) # No such case is matched

一般建议不要删除for循环中的项目。如果将 print(el, s) 紧跟在 for el in s: 之后,您就会看到发生了什么。您会发现 el 紧跟在 原始 字符串 adiiiityda 之后。所以在第四次迭代时,el'i's'ty'。您的代码无法在 'ty' 中找到此 'i',因此它 returns 'i',这不是您想要的。

您应该注意字符串是不可变的,因此您不能在循环中更改它,它不会按照您想要的方式运行:

def non_rep(s):
    for el in s:
        if el in s[1:]:
            s = s.replace(el,'')
    if len(s)>0:
        return s[0]
    return "No such case is matched"

str = "adiiiityda"
ch = non_rep(str)
print(ch)

您可以使用 collections.Counter 获取计数,然后仅保留唯一值:

from collections import Counter

s = "iiiiiiitya"

c = Counter(s)
''.join([i for i in c if c[i]==1])

输出:tya