#python #for-loop
#python #for-цикл
Вопрос:
Я работаю над упражнениями в учебнике, и меня просят создать программу нумерологии, которая принимает имя, присваивает каждой букве значение на основе порядка возрастания в алфавите и возвращает сумму букв.
Код, который я написал, отлично работает для любого имени, в котором не повторяется буква. Например, если имя ‘kayla’, я знаю, что оператор if остановится на первом экземпляре ‘a’. Есть ли в его текущем дизайне способ перехватить несколько букв или ему нужно сортировать буквы по-другому?
def main():
alphabet = 'abcdefghijklmnopqrstuvwxyxz'
user_name = raw_input('Please enter your name ')
value = sum = 0
for char in alphabet:
value = value 1
if char in user_name:
sum = sum value
print sum
Ответ №1:
Поскольку вы работаете с учебником, и я полагаю, вам не просто нужен ответ, вот подсказка. Вы повторяете (повторяете) неправильную вещь. Вы должны выполнять цикл user_name
, а не alphabet
.
Обновить. Если вам нужно хорошее «питоновское» решение вашей проблемы, это один из способов:
user_name = raw_input('Please enter your name ')
print sum(ord(letter.upper())-64 for letter in user_name)
Объяснение:
ord
возвращает код ASCII для символа, например65
для'A'
- Коды ASCII для A-Z от 65 до 90, в правильном порядке
- Вычитание 64 дает вам
1
forA
,2
forB
и так далее sum
это встроенная функция, которая делает именно то, что вы ожидаете- параметр to
sum
— это выражение, которое вычисляет последовательность чисел, по одной для каждой буквы вuser_name
Комментарии:
1. Спасибо, что указали, что я перебирал неправильные вещи. Это действительно помогло прояснить несколько других примеров, с которыми я боролся. Действительно здорово видеть, что то, что я пытался сделать с 7 строками, можно сделать за 2.
Ответ №2:
in
Функция проверяет только наличие элемента в списке. Вы можете решить проблему многими способами, но я думаю, что хорошим подходом к обучению является создание словаря для хранения пар букв, значений, а затем перебор символов имени для суммирования значений:
def main():
alphabet = 'abcdefghijklmnopqrstuvwxyxz'
values, val = {}, 1
for char in alphabet:
values[char] = val
val = 1
print values
user_name = raw_input('Please enter your name ')
value = sum = 0
for char in user_name.lower():
sum = values[char]
print sum
if __name__ == '__main__':
main()
Другая форма использует строковую функцию index для получения значения позиции буквы в строке.
Вот пример кода:
def main():
alphabet = 'abcdefghijklmnopqrstuvwxyxz'
user_name = raw_input('Please enter your name ')
sum = 0
for char in user_name.lower():
sum = alphabet.index(char) 1
print sum
if __name__ == '__main__':
main()
Комментарии:
1. Ваш второй пример был отличным, это направление, которое я искал. Спасибо
Ответ №3:
Очень простой способ, использующий понимание списка и встроенную sum
функцию:
alphabet = 'abcdefghijklmnopqrstuvwxyxz'
user_name = raw_input('Please enter your name ')
user_name = user_name.lower().strip()
value = sum([alphabet.index(c) 1 for c in user_name])
print(value)