Как обеспечить учет повторяющихся символов в цикле for в python

#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)
  

Объяснение:

  1. ord возвращает код ASCII для символа, например 65 для 'A'
  2. Коды ASCII для A-Z от 65 до 90, в правильном порядке
  3. Вычитание 64 дает вам 1 for A , 2 for B и так далее
  4. sum это встроенная функция, которая делает именно то, что вы ожидаете
  5. параметр 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)