Как работает сравнение двух символов (внутри строки) в Python - PullRequest
0 голосов
/ 30 мая 2019

Я начинаю изучать 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)

Я бы ожидал "rest $ t", но фактический результат: $ esta $ t

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Ваш код нуждается в модификации.

Измените ваш код, как указано ниже.

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'

Надеюсь, что это полезно.

0 голосов
/ 30 мая 2019

Есть две проблемы, во-первых, вы не начинаете итерацию там, где вы думаете:

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

i было перезаписано значением, отслеживающим цикл.

Во-вторых, is не означает эквивалентность значений. Это зарезервировано для оператора ==. Более простые типы, такие как int и str, могут показаться, что 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 в комментариях, в 99% случаев is не тот оператор, который вам нужен.

Что касается вашего кода, str.replace заменит все экземпляры аргумента, предоставленные во втором аргументе, если вы не укажете ему необязательное количество экземпляров для замены. Чтобы избежать замены первого символа, возьмите первый символ отдельно, например, 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
...