Сумма значений в словаре из символов

#python

#питон

Вопрос:

Я хотел бы прочитать входную строку, проанализировать ее, чтобы найти соответствующее числовое значение в заранее определенном словаре. Затем выведите сумму всех значений, считанных с пользовательского ввода. Это все, что я могу сделать с тем, что я знаю. Я ни за что на свете не могу понять, как добавить значения, если, допустим, пользователь вводит значение, которое должно выдавать 16

 user_input = input('Identify your choice(s): ')   def letterToInt(s):  letter = {'A': 1, 'E': 5, 'J': 10, 'O': 15, 'T': 20, 'Z': 26, 'YY': 50}  while True:  if user_input not in letter or user_input == ' ':  return 'Error: Input contains an invalid character. Valid input characters are A, E, J, O, T, Z, YY.'  elif len(user_input) == 1:  return letter[user_input]  if len(user_input) gt;= 1:  return letter[user_input]   print(letterToInt(user_input))  

Комментарии:

1. Похоже, вам нужно повторить ввод пользователя, проверить, является ли каждый символ индексом в dict, и если да, добавьте значение этого индекса в некоторую переменную-накопитель.

2. Вы действительно хотели, чтобы в нем было два персонажа YY ? Так Y что само по себе не имеет значения, но если YY есть во входных данных, которые вы добавляете 50 ?

3. Вам не нужен numpy sum() , это встроенная функция. @AhmedMohamedAEK

4. Тебе это не нужно or user_input == ' ' . поскольку места нет letter , user_input not in letter теста достаточно.

5. Зачем вам это нужно while True: ? Вы всегда возвращаетесь в каждой ветке, поэтому она никогда не зацикливается.

Ответ №1:

Поэтому я попытался написать этот код в очень простом и непрофессиональном формате. Я уверен, что это можно сделать лучше.

 def lettersToInt(user_input):  input_len = len(user_input)  sum = 0  letter = {'A': 1, 'E': 5, 'J': 10, 'O': 15, 'T': 20, 'Z': 26, 'YY': 50}  for i in range(0,input_len):  if user_input[i] == 'Y' and i lt; input_len-1:  if user_input[i 1] == 'Y':  p = 'YY'  sum = sum   letter[p]  elif user_input[i] in letter:  v = letter[user_input[i]]  sum = sum   v  else:  print("Not there")  print(sum) user_input = input('Identify your choice(s): ') lettersToInt(user_input)  

Очевидно, я добавил несколько операторов печати, но вы можете заменить их операторами возврата. Я рассмотрел этот конкретный ввод для кода, который я написал. Я также понимаю, что для случая » YY » он будет один раз указан в другой части кода.

Комментарии:

1. Извините, ребята, я в Германии (другой часовой пояс). Я опубликовал это прошлой ночью, перед тем как лечь спать, проснулся и пошел на работу сегодня утром. Я обычно не работаю над домашним заданием до тех пор, пока не закончу работу и все остальное, что у меня есть в течение дня, что довольно поздно, поэтому я не перезвонил вам всем своевременно.

2. Это нормально, не беспокойтесь. Я надеюсь, что решение сработало для вас.

Ответ №2:

Ваша while петля здесь совершенно бессмысленна. Учитывая входную строку s , все, что вам нужно сделать, это :

 def letterToInt(s: str) -gt; int:  letter = {'A': 1, 'E': 5, 'J': 10, 'O': 15, 'T': 20, 'Z': 26, 'YY': 50}  try:  return sum([letter[l] for l in s])  except KeyError as e:  raise ValueError(f"Invalid input letter '{e.args[0]}', valid letters are {','.join(letter.keys())}.")  

Комментарии:

1. Это никогда не будет YY ключом.

2. Это правда, но я понятия не имею, что он пытается с этим сделать, и я предполагаю, что это опечатка…

3. Поскольку это было сделано дважды, я сомневаюсь, что это опечатка.

4. Я все еще жду, когда он ответит на мой вопрос об этом.

5. Почему вы говорите, что это было сделано дважды ?

Ответ №3:

 user_input = input('Identify your choice(s): ') # your input str   def letterToInt(s: str) -gt; int:  # your dict  letter = {'A': 1, 'E': 5, 'J': 10, 'O': 15, 'T': 20, 'Z': 26, 'YY': 50}  # you need to convert s to a list rather than use a string  # then if any letter in s is no in the letter dictionary then raise an error  if any(k not in letter for k in s.upper()) or s == ' ':  raise ValueError('Error: Input contains an invalid character. Valid input characters are A, E, J, O, T, Z, YY.')  # list comprehension to find the values and sum  return sum([letter[k] for k in s.upper()])   print(letterToInt(user_input))  # Identify your choice(s): AJ # 11  

Комментарии:

1. Зачем вам это нужно list(s) ? Вы можете напрямую зацикливаться на строках.

2. Как это когда-нибудь будет соответствовать YY ключу в словаре?

3. Ха, да, вы можете перебирать строку. Глупая я.

4. Вам не нужно использовать понимание списка с sum помощью . Вместо этого вы можете передать выражение генератора. return sum(letter[k] for k in s) .

5. @Крис, это просто предпочтение, потому что numpy движется в этом направлении: Support for non-sequence iterables such as generators is deprecated as of NumPy 1.16 and will raise an error in the future.