【问题标题】:How does comparing two chars (within a string) work in Python比较两个字符(在字符串内)如何在 Python 中工作
【发布时间】:2019-05-30 17:20:59
【问题描述】:

我开始学习 Python 并查看了以下网站:https://www.w3resource.com/python-exercises/string/ 我在 #4 上工作,即“编写一个 Python 程序以从给定字符串中获取一个字符串,其中所有出现的第一个字符都已更改为 '$',但第一个字符本身除外。”

str="restart"
char=str[0]
print(char)

strcpy=str
i=1
for i in range(len(strcpy)):
  print(strcpy[i], "\n")
  if strcpy[i] is char:
    strcpy=strcpy.replace(strcpy[i], '$')
print(strcpy)

我希望“resta$t”,但实际结果是:$esta$t

感谢您的帮助!

【问题讨论】:

  • 字符串是不可变的,所以strcpy.replace不会改变strcpy,它会返回一个新的str对象。你需要strcpy = strcpy.replace...。另外,我会避免使用诸如 str 之类的内置变量名
  • 我认为这不能解决您的问题,但风格提示:is 不应该用于执行相等检查。如果您不确定is 是否适合解决某个问题,99% 的情况不是。
  • 要搭载@Kevin 的评论,这将适用于某些对象,例如字符串或int,但尝试a, b = [], []; a is b 之类的东西,你会得到False,即使a==bTrue
  • 谢谢! strcpy=strcpy.replace(strcpy[i], '$') 现在可以工作了。但是,我得到以下输出: $esta$t 我不明白这一点,因为 for 循环应该跳过第一个字符(在位置 0) str="restart" char=str[0] print(char) strcpy=str i= 1 for i in range(1,len(strcpy)): print(strcpy[i], "\n") if strcpy[i] is char: strcpy=strcpy.replace(strcpy[i], '$') print (strcpy)
  • @pythonlearner 那是因为你实际上并没有跳过第一个字符。您使用 for 循环重新分配 i。但即使您确实跳过了,str.replace 也会替换所有出现的字符,或者如果指定了前 n 次出现。

标签: python string-comparison


【解决方案1】:

有两个问题,第一,你没有在你认为的地方开始迭代:

i = 1 # great, i is 1
for i in range(5):
    print(i)
0
1
2
3
4

i 已被跟踪循环的值覆盖。

其次,is 并不意味着值等价。这是为== 运算符保留的。 intstr 等更简单的类型可以使 is 看起来以这种方式工作,但其他类型的行为则不是这样:

a, b = 5, 5

a is b
True

a, b = "5", "5"
a is b
True

a==b
True

### This doesn't work
a, b = [], []

a is b
False

a == b
True

正如@Kevin 在 cmets 中指出的那样,99% 的情况下,is 不是您想要的运算符。

就您的代码而言,str.replace 将替换随第二个 arg 提供的参数的所有实例,除非您为其提供可选数量的要替换的实例。为避免替换第一个字符,单独抓取第一个字符,如val = somestring[0],然后使用切片替换其余字符,无需迭代:

somestr = 'restart' # don't use str as a variable name

val = somestr[0] # val is 'r'

# somestr[1:] gives 'estart'
x = somestr[1:].replace(val, '$')

print(val+x)
# resta$t

如果您仍想迭代,也可以在切片上执行此操作:

# collect your letters into a list
letters = []
char = somestr[0]

for letter in somestr[1:]: # No need to track an index here
    if letter == char: # don't use is, use == for value comparison 
       letter = '$' # change letter to a different value if it is equal to char
    letters.append(letter)

# Then use join to concatenate back to a string
print(char + ''.join(letters))
# resta$t

【讨论】:

    【解决方案2】:

    您的代码需要修改。

    使用如下所示修改您的代码。

    strcpy="restart"
    
    i=1
    for i in range(len(strcpy)):
       strcpy=strcpy.replace(strcpy[0], '$')[:]
    print(strcpy)
    # $esta$t
    

    另外,用 Python 编写代码的最佳做法是使用 Function。您可以如下修改您的代码,也可以使用此功能。

    def charreplace(s):
       return s.replace(s[0],'$')[:]
    
    charreplace("restart")
    #'$esta$t'
    

    希望这有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2012-11-04
      • 2019-01-14
      • 2010-11-13
      相关资源
      最近更新 更多