尝试使用Python 3.6打印字符串中重复字符的首次出现时出错

时间:2017-10-14 08:50:43

标签: python string python-3.x printing

我正在编写一个简单的程序来用*(asterisk)替换字符串中的重复字符。但这里的事情是我可以在字符串中打印第一次出现的重复字符,但不能打印其他出现的字符。

例如, 如果输入Google,则输出应为Go**le

我可以用星号替换重复的字符,但是无法找到打印第一次出现的字符的方法。换句话说,我现在的输出是****le

请查看我的 Python3 代码:

s = 'Google'
s = s.lower()
for i in s:
    if s.count(i)>1:
        s = s.replace(i,'*')
print(s)

有人可以建议我应该采取什么措施来获得所需的输出吗?

3 个答案:

答案 0 :(得分:2)

这是我的方法:

首先,您需要找到第n个字符。然后,您可以使用以下代码段替换其他匹配项:

s = s[:position] + '*' + s[position+1:]

完整的示例代码:

def find_nth(haystack, needle, n):
    start = haystack.find(needle)
    while start >= 0 and n > 1:
        start = haystack.find(needle, start+len(needle))
        n -= 1
    return start

s = 'Google'
s_lower = s.lower()

for c in s_lower:
    if s_lower.count(c) > 1:
        position = find_nth(s_lower, c, 2)
        s = s[:position] + '*' + s[position+1:]
print(s)

可运行链接:https://repl.it/Mc4U/4

正则表达式方法:

import re

s = 'Google'

s_lower = s.lower()

for c in s_lower:
    if s_lower.count(c) > 1:
        position = [m.start() for m in re.finditer(c, s_lower)][1]
        s = s[:position] + '*' + s[position+1:]

print(s)

可运行链接:https://repl.it/Mc4U/3

答案 1 :(得分:2)

replace将替换char的所有出现。您需要按照已经看过的字符进行操作,如果重复这些字符则替换JUST这个字符(在特定索引处)。

字符串不支持索引分配,因此我们可以构建一个代表新字符串的新列表,然后再''.join()

使用Set,您可以关注您已经看过的内容。

看起来像这样:

s = 'Google'
seen = set()
new_string = []

for c in s:
    if c.lower() in seen:
        new_string.append('*')
    else:
        new_string.append(c)
        seen.add(c.lower())

new_string = ''.join(new_string)
print(new_string)
Go**le

答案 2 :(得分:2)

如何使用列表组合?当从另一个列表构建列表时(这是你在这里做的一种,因为我们将字符串视为列表),列表理解是一个很好的工具:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

inputstring = 'Google'.lower()
outputstring = ''.join(
    [char if inputstring.find(char, 0, index) == -1 else '*'
    for index, char in enumerate(inputstring)])
print(outputstring)

这会产生go**le

希望这有帮助!

已修改使用' *'作为替换字符而不是'#')