Мне нужно преобразовать строку в целое слово в диапазоне от [от нуля до десяти]
Пример ввода 1:
a=two3four
Необходимый результат:
234
Пример 2:
b=fivesixseven
Необходимый результат:
567
Мой код:
def w2n (number):
words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
return "".join(str(words.index(number[i])) for i in range(0,len(number)))
print(w2n("onetwoseven"))
Я получаю ошибку в этом коде
Traceback (most recent call last):
File "HelloWorld.py", line 5, in <module>
print(w2n("onetwoseven"))
File "HelloWorld.py", line 3, in w2n
return "".join(str(words.index(number[i])) for i in range(0,len(number)))
File "HelloWorld.py", line 3, in <genexpr>
return "".join(str(words.index(number[i])) for i in range(0,len(number)))
ValueError: 'o' is not in list
Пожалуйста, объясните мне, почему возникает эта ошибка и как получить вывод для моих двух примеров ввода (дан).
3 ответа
Это решение, которое я придумал:
def w2n(number):
words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
for i in words:
number = number.replace(i, str(words.index(i)))
return int(number)
a="two3four"
print(w2n(a)) # 234
b="fivesixseven"
print(w2n(b)) # 567
Вы можете использовать регулярные выражения для извлечения цифр и их имен, затем заменить извлеченные имена их цифровыми представлениями и объединить их в строку. Имейте в виду, что «десять» — это не цифра, и ее не должно быть в списке.
import re
# A dictionary of names of digits
digits = {'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4',
'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'}
digits.update({str(i): str(i) for i in range(10)})
# The regular expression for searching the names
numbers = re.compile("|".join(digits))
"".join(digits[w] for w in numbers.findall("two3four"))
#'234'
"".join(digits[w] for w in numbers.findall("fivesixseven"))
#'567'
Ответ на регулярное выражение очень умный, но если вам нужно решение без регулярного выражения, вы можете использовать длину чисел как слов, чтобы получить их начальный и конечный индекс в исходном вводе:
def w2n(number):
words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
for word in words:
if word in number:
start = number.index(word)
end = start + len(word)
print(f'Word "{word}" starts at {start} and ends at {end}')
extracted_word = number[start:end]
number = number.replace(word, str(words.index(extracted_word)) )
return number
print( w2n('two3four') )
print( w2n('fivesixseven') )
Переписывая исходный ввод числовым представлением каждого слова, мы игнорируем любые цифры во вводе и оставляем их на месте, как вы можете видеть в примере "two3four"
.
Это выведет:
Word "two" starts at 0 and ends at 3
Word "four" starts at 2 and ends at 6
234
Word "five" starts at 0 and ends at 4
Word "six" starts at 1 and ends at 4
Word "seven" starts at 2 and ends at 7
567
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.
number[i]
— одна буква.words.index
– это единственный символ с индексомi
, поэтому в приведенном вами примере сообщения об ошибке вы видите'o' in not in list
, это первая буква"one"
в"onetwoseven"
.