Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 8, 2016 16:33:26

gratiani
Зарегистрирован: 2016-05-30
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод replace

 >>> word = 'spamspamspam'
>>> for x in word:
...     word = word.replace(x, '.'+x)
... 
>>> word
'...s...p...a...m...s...p...a...m...s...p...a...m'
Что нужно сделать, чтобы при каждом обращении к методу точка конкатенировала только с текущим строковым символом, а не добавляла ее еще в подобные символы. В общем что необходимо применить, чтобы при выводе стояла только одна точка перед каждым символом?

Отредактировано gratiani (Авг. 8, 2016 16:34:18)

Офлайн

#2 Авг. 8, 2016 16:58:19

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Метод replace

Метод replace заменяет все вхождения одной строки на другую. поэтому получая в цикле в переменную х значение из word когда х = ‘s’ ты в строке заменяешь все вхождения s на .s но так как их в строке три и в цикле ты обходишь всю строку то соответственно вторая s после замены будет .s то есть x = .s а ты производишь замену на ‘.’+'.s' в результате все s. меняются на ..s и еще раз в цикле замена ..s на ‘.’+'..s' вот тебе и результат столько точек перед буквой сколько букв в слове. может проще так

 word = list('spamspamspam')
for i,x in enumerate (word):
    word [i] = '.'+x
print (''.join(word))
.s.p.a.m.s.p.a.m.s.p.a.m
твой код конечно сработает при условии что в слове нет одинаковых букв

Отредактировано marvellik (Авг. 8, 2016 17:00:23)

Офлайн

#3 Авг. 8, 2016 17:52:22

Stepan_M
Зарегистрирован: 2016-07-20
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

Метод replace

 "".join(("." + i for i in tuple(word)))

Офлайн

#4 Авг. 9, 2016 01:22:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Метод replace

gratiani
Что нужно сделать, чтобы при каждом обращении к методу точка конкатенировала только с текущим строковым символом
Используй отладку (выводи на экран промежуточные знанения). Тогда будешь понимать, что происходит на каждом шаге цикла.
  
>>> word = 'spamspamspam'
>>> for x in word:
...     word = word.replace(x, '.' + x)
...     print(x, word)
... 
s .spam.spam.spam
p .s.pam.s.pam.s.pam
a .s.p.am.s.p.am.s.p.am
m .s.p.a.m.s.p.a.m.s.p.a.m
s ..s.p.a.m..s.p.a.m..s.p.a.m
p ..s..p.a.m..s..p.a.m..s..p.a.m
a ..s..p..a.m..s..p..a.m..s..p..a.m
m ..s..p..a..m..s..p..a..m..s..p..a..m
s ...s..p..a..m...s..p..a..m...s..p..a..m
p ...s...p..a..m...s...p..a..m...s...p..a..m
a ...s...p...a..m...s...p...a..m...s...p...a..m
m ...s...p...a...m...s...p...a...m...s...p...a...m
>>> print(word)
...s...p...a...m...s...p...a...m...s...p...a...m
>>> 
Написана какая-то запутанная хрень, а видно это только при отладке.

Вот при отладке видно, что на четвёртом шаге получается нужная строка.
Добавляешь ограничитель на количество шагов
  
>>> word = 'spamspamspam'
>>> for x, _ in zip(word, range(4)):
...     word = word.replace(x, '.' + x)
...     print(x, word)
... 
s .spam.spam.spam
p .s.pam.s.pam.s.pam
a .s.p.am.s.p.am.s.p.am
m .s.p.a.m.s.p.a.m.s.p.a.m
>>> print(word)
.s.p.a.m.s.p.a.m.s.p.a.m
>>> 
Когда всё готово, отладку убираешь
  
>>> word = 'spamspamspam'
>>> for x, _ in zip(word, range(4)):
...     word = word.replace(x, '.' + x)
... 
>>> print(word)
.s.p.a.m.s.p.a.m.s.p.a.m
>>> 

Вот так можешь сделать
  
>>> word = 'spamspamspam'
>>> word = '.' + '.'.join(word)
>>> print(word)
.s.p.a.m.s.p.a.m.s.p.a.m
>>> 

Вот так можешь сделать
  
>>> import re
>>> 
>>> word = 'spamspamspam'
>>> word = re.sub(r'.', r'.\g<0>', word)
>>> print(word)
.s.p.a.m.s.p.a.m.s.p.a.m
>>> 



Отредактировано py.user.next (Авг. 9, 2016 01:31:05)

Офлайн

#5 Авг. 9, 2016 10:34:38

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Метод replace

py.user.next
Когда всё готово, отладку убираешь

 >>> word = 'spamspamspam'
>>> for x, _ in zip(word, range(4)):
...     word = word.replace(x, '.' + x)
... 
>>> print(word)
.s.p.a.m.s.p.a.m.s.p.a.m
код под конкретное слово и при его изменении не работает
 >>> word = 'spamspamspamer'
>>> for x, _ in zip(word, range(4)):
...     word = word.replace(x, '.' + x)
... 
>>> print(word)
.s.p.a.m.s.p.a.m.s.p.a.mer
а в остальном все ок. сижу голову ломаю как работает это
word = ‘.’ + ‘.’.join(word)

Отредактировано marvellik (Авг. 9, 2016 10:37:56)

Офлайн

#6 Авг. 9, 2016 10:50:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Метод replace

marvellik
а в остальном все ок. сижу голову ломаю как работает это
  
word = '.' + '.'.join(word)
Надо понимать, что строка состоит из элементов, где каждый элемент - это строка.

  
>>> for i in 'abcd':
...     print(i)
... 
a
b
c
d
>>> 'a'[0][0][0]
'a'
>>> 
>>> '.'.join(['a', 'b', 'c'])
'a.b.c'
>>> 
>>> '.'.join('abc')
'a.b.c'
>>>



Офлайн

#7 Авг. 9, 2016 11:09:25

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Метод replace

py.user.next
Надо понимать, что строка состоит из элементов
все понял. меня сбило с толку ‘.’ + перед ‘.’.join(word) когда посмотрел вывод дошло что в начале точки нет и
конкатенация ‘.’ + добавляет эту точку в начале строки

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version