Posts: 5
Threads: 2
Joined: Mar 2017
I want to take a string and replace every letter in the string with the second to next letter in the alphabet. eg(a => c, b => d). My code changes the string does not save and will change back to the original string when changing the next letter. Thanks for any help
def fix(block):
alf = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
cur = 0
old = 0
new = 2
while cur < 26:
new_block = []
get = block.replace(alf[old], alf[new])
old = old + 1
new = new + 1
cur = cur + 1
return get
Posts: 5
Threads: 2
Joined: Mar 2017
(Apr-18-2017, 01:43 PM)Marshall_99 Wrote: I want to take a string and replace every letter in the string with the second to next letter in the alphabet. eg(a => c, b => d). My code changes the string does not save and will change back to the original string when changing the next letter. Thanks for any help
def fix(block):
alf = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
cur = 0
old = 0
new = 2
while cur < 26:
new_block = [] #nevermind this
get = block.replace(alf[old], alf[new])
old = old + 1
new = new + 1
cur = cur + 1
return get
Posts: 566
Threads: 10
Joined: Apr 2017
Apr-18-2017, 07:14 PM
(This post was last modified: Apr-18-2017, 07:14 PM by volcano63.)
Here are the issues in your code:
- You always replace in the same block - overwriting get with the latest replacement operation result
- You don't check crossing list boundaries
- Remember p.1? It does not matter, because you exit after first iteration!
- You may end up replacing character many times - if you replace 'a' with 'c', then you'll replace 'c' with 'e', etc
- There are better ways to manage loop!
- There is module string that contains ascii_lowercase constant - well, that you may not have known
- Variable names - well, they are not very successful
Since you have shown some effort - here is the proper way to do it (I hope it is not homework)
from string import ascii_lowercase
def fix(word, char_offset=2):
new_word = ''
for char_ in word:
# Get index of replacement character and keep it below 26, so for "z" it will be "b"
char_index = ascii_lowercase.find(char_)
if char_index > -1:
replacement_index = (char_index + char_offset) % 26
new_word += ascii_lowercase[replacement_index]
else:
new_word += char_
return new_word PS I did not test the code - if there are some glitches, I leave fixing them to you as an excercise
Test everything in a Python shell (iPython, Azure Notebook, etc.) - Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
- Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
- You posted a claim that something you did not test works? Be prepared to eat your hat.
Posts: 7,315
Threads: 123
Joined: Sep 2016
(Apr-18-2017, 07:14 PM)volcano63 Wrote: here is the proper way to do it (I hope it is not homework) Okay way,he will get full score if teacher is not full out Pythonic
Look like a typicality homework task.
So when we are in solution modus.
from string import ascii_lowercase
def fix(word, char_offset=2):
char = ascii_lowercase
for index,item in enumerate(word, char_offset):
yield char[index] Test:
>>> s = 'abcde'
>>> ''.join(fix(s))
'cdefg'
>>> list(fix(s))
['c', 'd', 'e', 'f', 'g']
Posts: 566
Threads: 10
Joined: Apr 2017
Apr-18-2017, 09:00 PM
(This post was last modified: Apr-18-2017, 09:00 PM by volcano63.)
(Apr-18-2017, 08:45 PM)snippsat Wrote: (Apr-18-2017, 07:14 PM)volcano63 Wrote: here is the proper way to do it (I hope it is not homework) Okay way,he will get full score if teacher is not full out Pythonic
Look like a typicality homework task.
So when we are in solution modus.
from string import ascii_lowercase
def fix(word, char_offset=2):
char = ascii_lowercase
for index,item in enumerate(word, char_offset):
yield char[index]
Wow! Could you please explain how that runs without exception?
>>> list(fix('xyz'))
['c', 'd', 'e'] Ooops, aren't you a sneaky one?
Test everything in a Python shell (iPython, Azure Notebook, etc.) - Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
- Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
- You posted a claim that something you did not test works? Be prepared to eat your hat.
Posts: 7,315
Threads: 123
Joined: Sep 2016
(Apr-18-2017, 09:00 PM)volcano63 Wrote: Ooops, aren't you a sneaky one? He a little quick,tested only start
Posts: 566
Threads: 10
Joined: Apr 2017
(Apr-18-2017, 09:22 PM)snippsat Wrote: (Apr-18-2017, 09:00 PM)volcano63 Wrote: Ooops, aren't you a sneaky one? He a little quick,tested only start 
I should have caught it earlier, but after couple of weeks of insomnia ....  And it looked so convincing
Test everything in a Python shell (iPython, Azure Notebook, etc.) - Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
- Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
- You posted a claim that something you did not test works? Be prepared to eat your hat.
Posts: 7,315
Threads: 123
Joined: Sep 2016
So a fix.
def fix(word, char_offset=2):
a = ord('a')
return ''.join(chr((ord(char) - a + char_offset) % 26 + a) for char in word.lower()) Test:
>>> fix('abc')
'cde'
>>> fix('xyz')
'zab' I think also that deque that has build in rotate,
and maybe combo with str.maketrans could be okay.
Posts: 566
Threads: 10
Joined: Apr 2017
(Apr-18-2017, 11:20 PM)snippsat Wrote: I think also that deque that has build in rotate,
and maybe combo with str.maketrans could be okay.
Now you are showing off
Test everything in a Python shell (iPython, Azure Notebook, etc.) - Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
- Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
- You posted a claim that something you did not test works? Be prepared to eat your hat.
Posts: 5
Threads: 2
Joined: Mar 2017
Thank you both for all your help! Don't worry it was not homework, just my own challenge.
|