Python 将第一个字符的所有后续匹配项替换为`$`

Python 将第一个字符的所有后续匹配项替换为`$`,python,python-3.x,Python,Python 3.x,代码的问题是“输入一个单词并检查单词的第一个字符是否在单词中重复”。如果是,则将除第一个字符外的所有重复字符更改为$ 所以我对下面的代码进行了编码,并使用逻辑从单词的第二个字符开始循环,以便第一个字符保持不变 a=input() for i in range(1,len(a)): if(a[i]==a[0]): b=a.replace(a[i],'$') print(b) 对于上面的程序,我输入的是'agra',出乎意料的是输出的是'gr$'。第一个字符也被改变了。 我

代码的问题是“输入一个单词并检查单词的第一个字符是否在单词中重复”。如果是,则将除第一个字符外的所有重复字符更改为
$

所以我对下面的代码进行了编码,并使用逻辑从单词的第二个字符开始循环,以便第一个字符保持不变

a=input()
for i in range(1,len(a)):
    if(a[i]==a[0]):
        b=a.replace(a[i],'$')
print(b)
对于上面的程序,我输入的是'agra',出乎意料的是输出的是'gr$'。第一个字符也被改变了。
我的逻辑有什么问题?您还建议什么解决方案?

更简单的方法是:

代码: 测试代码: 结果:
您更改了整个单词/句子“a”:a.replace(…)

有关python的正确解决方案,请参阅Stephen Rauch的答案。

我认为你试图以一种非常“非音速”的方式实现的是:

如何进行更换?在python中:字符串是不可变的,这意味着您不能“就地”替换字符。尝试这样做:

a='agra'
a[3] = '$'
您将得到一个错误:

TypeError: 'str' object does not support item assignment
如果要将字符串的第i个字符替换为
$
,则必须编写:

b = b[:i] + '$' + b[i+1:]
也就是说:从
b[0]
,…,
b[i-1]
构建一个新字符串,添加一个
$
,然后继续执行
b[i+1]
,…,
b[len(a)-1]
。如果在代码中使用此选项,您将获得:

a = input()
b = a
for i in range(1, len(a)):
    if a[i] == a[0]:
        b = b[:i] + '$' + b[i+1:]
print (b)
好的,它可以工作,但不要这样做,因为它非常“非音速”且效率低下

开始编辑 顺便说一下,您不需要替换,只需逐个字符构建字符串:

a = input()
b = a[0] # start with first char
for i in range(1, len(a)):
    if a[i] == a[0]:
        b += '$' # $ if equals to first char
    else:
        b += a[i] # else the current char
print (b)
结束编辑

这让我产生了这样的想法:

a=input()
b="".join('$' if i!=0 and c==a[0] else c for i,c in enumerate(a))
print(b)
说明:列表理解包括
a
的所有字符及其位置
i
(这就是
枚举的作用)。对于每个成对位置,如果位置不是
0
(不是第一个字符),并且如果字符等于
a[0]
,则放置一个
$
。否则就把角色本身放进去。把所有的东西粘在一起做成一根新的绳子


同样,这不是你想要做的事情的正确方法,因为还有另一种更简洁、更容易的方法(参见Stephen Rauch的回答),但它展示了你有时如何处理python中的困难。

因为这就是
replace
所做的。如果你使用
replace()
,甚至循环都没有意义。取一个不带第一个字母的子字符串并替换它,或者遍历每个字符并仅更改该字符。FYR,字母表是一组有序的字母。你所说的字母表是一个字母字符,或者只是一个字母。@Andreytukin你确定OP的意思是“第一个字符”,而不是“第一个字母字符”?@DyZ我大约99%确定。代码不包含控制流的任何痕迹,这些痕迹可能以某种方式对各种类型的字符做出不同的反应。相反,代码在
replace
部分中包含一个明显的错误。我假设问题的焦点是
替换
,而不是字符类型。“字母表”这个词的重复使用看起来就像是“字符”选错了词。我决定把它删掉,因为它看起来太奇怪了。我可能错了,但我必须在某个地方设置阈值……循环效率非常低。它多次分割
a
。不需要循环。是的,我尝试只使用作者的代码来显示问题所在;)
a[1:len(a)]
相当糟糕
a[1::
就是这样做的。我喜欢
b=”“.join('$'如果I!=0和c==a[0],否则c代表枚举(a)中的I,c))
方法。让·弗朗索瓦·法布一世在OP的试验和列表理解之间添加了一个步骤,以显示进展情况。我的计划是从OP的想法转变为Python的想法,即使存在更好的解决方案。也许OP会发现这很有启发性。对我来说,这更像是“TL;DR”,对不起。
TypeError: 'str' object does not support item assignment
b = b[:i] + '$' + b[i+1:]
a = input()
b = a
for i in range(1, len(a)):
    if a[i] == a[0]:
        b = b[:i] + '$' + b[i+1:]
print (b)
a = input()
b = a[0] # start with first char
for i in range(1, len(a)):
    if a[i] == a[0]:
        b += '$' # $ if equals to first char
    else:
        b += a[i] # else the current char
print (b)
a=input()
b="".join('$' if i!=0 and c==a[0] else c for i,c in enumerate(a))
print(b)