+ 2
Why does the translation table fail in this code?
A value error occurs on translation specially saying the length of the keys in the translation table must be 1 https://code.sololearn.com/cf3tUWb32HHH/?ref=app
28 Answers
+ 1
Fxfx right, I missed that part.
or if you add a whitespace after each word, you can skip the list join part. strip() cleans up the result.
mydict={'0': 'zero','1': 'one','2': 'two','3': 'three','4': 'four','5': 'five','6': 'six','7': 'seven','8': 'eight','9': 'nine','10': 'ten'}
txt = input().split()
translated=""
for i in range(len(txt)):
if txt[i] in mydict:
translated+=mydict[txt[i]]+" "
else:
translated+=txt[i]+" "
print(translated.strip())
+ 2
#try inputting
# I have 1 pen and 2 pencils.
# or 1 2 3 10 20 101
# be sure to leave space before and after the numbers. It is just simple replacement. You would need to use regex otherwise.
edit: i found out the simpler method was iterating the characters, not the word, and 10 was becoming oneten.
So the words have to be split first.
The code below should work. It could be optimized, but maybe other members would give it a shot.
txt = input().lower()
mydict={'0': 'zero','1': 'one','2': 'two','3': 'three','4': 'four','5': 'five','6': 'six','7': 'seven','8': 'eight','9': 'nine','10': 'ten'}
wlist = txt.split()
for i,w in enumerate(wlist):
if w in mydict.keys():
wlist[i] = mydict[w]
translate = ' '.join(wlist)
print(translate)
+ 2
You're right.
Good night...
+ 1
Yes it's zero. The code works when I pass a single key like 1 but if I pass a phrase like: I have 1 pen and 2 pencils, I can't get this result: I have one pen and two pencils
+ 1
I tried already but I still get a key error since the program is expecting only one input and not a string of words
input().lower()
mydict={'0': 'z','1': 'one','2': 'two','3': 'three','4': 'four','5': 'five','6': 'six','7': 'seven','8': 'eight','9': 'nine','10': 'ten'}
#trans_dic = str.maketrans(mydict)
#tanslated = txt.translate(trans_dic)
#print(tanslated)
# the code above doesnt work trans table is not to be used in this case
# advised my Bob li to use input As key to output values each time a key is met
for key in txt:
translated = mydict[txt]
print (translated )
+ 1
Please can you walk me through your code with a little explanation
+ 1
Ok great thank you. So we split and join in the end right??
+ 1
Thank you so much
+ 1
Hello Gemuh Hans
I think I've got a begining of soluce for you...
Try the code below: it is good for 0 to 9, but it return "onez" for 10....
For num>10, I think you'll have to operate by txt.split() to format your str in list, before compare it to mydict...
translated=""
for i in range(len(txt)):
if txt[i] in mydict:
translated+=mydict[txt[i]]
else:
translated+=txt[i]
print(translated)
+ 1
Hello Bob_Li.
I know that...
That's why I propose to operate with txt.split() to transform in word list, before processing the translation.
The last thing to do is translated.join(" ") to transform the list in a texte with space.
You're not far away ;)
Good Luck...
+ 1
Gemuh Hans
Maybe reformatting html strings? hacky, obscure stuff, mostly.
translate only works on single characters. you can map those characters to a different single character, to a different string, or None.
That's why you can't use it in this case, because you have "10":"ten". The key have to be single character.
here is a nice video of probable use case:
https://m.youtube.com/watch?v=0kYctEx_O28
+ 1
Ahhh yes you are right. I tried the code eliminating the key value pair of '10':'ten' and it worked correctly. I now get it.. we can use it only in this situation
0
Gemuh Hans
maketrans is the wrong thing to use for this. It is used for character replacement.
Just use the input as the dict key.
txt = input().lower()
mydict={'0': 'z','1': 'one','2': 'two','3': 'three','4': 'four','5': 'five','6': 'six','7': 'seven','8': 'eight','9': 'nine','10': 'ten'}
translated = mydict[txt]
print(translated)
0
I tried your modification to my code and it doesn't work I don't understand why. Is there something I am missing
0
The input is actually a phrase which contains words and numbers and I am supposed to replace only the numbers to make the phrase read with only words
0
are you sure about the z in '0':'z'? maybe it's'zero'
0
you have to iterate over the words in the sentence.
0
ok, here's the list comprehension version
txt = input().lower()
mydict={'0': 'zero','1': 'one','2': 'two','3': 'three','4': 'four','5': 'five','6': 'six','7': 'seven','8': 'eight','9': 'nine','10': 'ten'}
res = ' '.join([mydict[w] if w in mydict.keys() else w for w in txt.split()])
print(res)
0
if you directly iterate a string, it will be character by character.
txt = "I have 10 pencils"
for c in txt:
print(c)
I
h
a
v
...
We don't want this. We want words.
so we split the string into a list, along the blank spaces.
wlist = txt.split()
wlist = ['I', 'have', '10', 'pencils']
we can then iterate this list then replace the words if they are in mydict.
I used enumerate to get the index and value of the items in the list
for index, value in enumerate(mylist):
if value in mydict.keys():
mylist[index] = mydict[value]
Then use join to reform the string from the updated list.
0
right.