#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()
, это встроенная функция. @AhmedMohamedAEK4. Тебе это не нужно
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.