В настоящее время я изучаю python, и я борюсь с проблемой, в которой мне нужно получить имя в качестве ввода от пользователя и получить первую букву имени и, в зависимости от буквы, сказать ему, в какой день недели ему нужно go (контекст не имеет значения), поэтому: Понедельник: А - С; вторник: Д - Г; Среда: Ч - Л; Четверг: М; пятница: N - Q; Суббота: Р - С; Воскресенье: Т - Я.
tuple_letter = (['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'], ['m'], ['n', 'o', 'p', 'q'], ['r', 's', 't'], ['u', 'v', 'w', 'x', 'y', 'z'])
tuple_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
name = input("Name: \n")
for letters in tuple_letter:
if letters.count(name[0]) >= 1:
print(name + ", you should go to the hospital on " + tuple_week[letters])
Я думал, что так же, как в С#, например, «буквы» внутри for, на самом деле он будет действовать как i++, что он будет считаться числом, но на самом деле сам python знает, что когда мы говорим «для букв в tuple_letter», я на самом деле я ссылаюсь на списки внутри списка «tuple_letter», поэтому он не работает, поскольку я основывал свою логику на том факте, что я буду использовать его для ссылки на элемент каждого списка, потому что я помещаю каждый элемент каждого список в том же порядке (понедельник и 'a', 'b', 'c' == 1, ....)
В заключение и в связи с заголовком у меня возникла идея создать словарь, в котором каждый ключ будет соответствовать дню недели для списка букв, как я пытался. Итак, как я могу это сделать? Является ли это возможным? Лучшие способы?






Вы можете, это может иметь немного более логичный смысл. Работа со словарями в Python может быть простой, поскольку они соответствуют стандартам JSON. Обязательное чтение здесь: https://www.w3schools.com/python/python_dictionaries.asp
В вашем примере будет использоваться такой словарь:
example_dict = {
"Monday": ['a', 'b', 'c'],
"Tuesday": ['d', 'e', 'f', 'g'],
"Wednesday": ['h', 'i', 'j', 'k', 'l'],
"Thursday": ['m'],
"Friday": ['n', 'o', 'p', 'q'],
"Saturday": ['r', 's', 't'],
"Sunday": ['u', 'v', 'w', 'x', 'y', 'z']
}
Оттуда вы можете выполнять итерацию с помощью цикла for и следовать поиску индекса с помощью чего-то вроде example_dict[x]. Вот вторая часть вашего кода, преобразованная, чтобы показать это:
name = input("Name: \n")
if len(name) > 0:
for i in example_dict:
# Lower case the letter for comparison
if name[0].lower() in example_dict[i]:
print(name + ", you should go to the hospital on " + i)
Вы можете хранить списки в словарях! Итак, после того, как вы повторили значения, нужно просто проверить, какой день содержит букву имени, которое вы анализируете.
Я надеюсь, что это поможет вам начать работу.
tuple_letter = (['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'], ['m'], ['n', 'o', 'p', 'q'], ['r', 's', 't'], ['u', 'v', 'w', 'x', 'y', 'z'])
tuple_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
dictionary = dict(zip(tuple_week, tuple_letter))
print(dictionary)
name = input("Name: \n")
for key, value in dictionary.items():
if name.lower()[0] in value:
print(name.capitalize() , ", you should go to the hospital on " , key)
Словари работают, имея ключи, соответствующие значениям, поэтому, если вы делаете dict[key] или dict.get(key), вы получаете значение.
Проблема в том, что с вашим сценарием кодирование немного повторяется.
letter_to_day = {
'a':"Monday",
'b':"Monday",
'c':"Monday",
'd':"Tuesday",
... # fair amount of typing
'z':"Sunday"
}
name = input("Name: \n")
print(name + ", you should go to the hospital on " + letter_to_day[name[0].lower()])
#raises an error if it isn't a letter
print(name + ", you should go to the hospital on " + letter_to_day.get(name[0].lower(), "not a letter"))
#this one will return "not a letter" if it isn't found
Вы можете сделать некоторые обходные пути, например, сделать
letter_to_day = {}
for day in tuple_week:
for letters in tuple_letter:
for letter in letters:
letter_to_day[letter] = day
вместо того, чтобы вводить все это или даже делать print(letter_to_day) и копировать и вставлять результат.
Но оказывается есть и другой способ - можно использовать неравенства со строками (а также списками, но это не важно).
Строки позже в алфавитном порядке больше, а строки раньше меньше. "a" < "b" есть True.
Это означает, что вы можете сделать что-то вроде
def letter_to_day(letter):
if "a" <= letter <= "c":
return "Monday"
elif "d" <= letter <= "g":
return "Tuesday"
elif "h" <= letter <= "l":
return "Wednesday"
elif letter == "m":
return "Thursday"
elif "n" <= letter <= "q":
return "Friday"
elif "r" <= letter <= "s":
return "Saturday"
elif "t" <= letter <= "z":
return "Sunday"
else:
return "not a letter"
name = input("Name: \n")
print(name + ", you should go to the hospital on " + letter_to_day(name[0].lower()))
Ответ на этот пост от iamwbj отвечает на ваш вопрос о словаре, в котором дни являются ключами, а списки букв - значениями. Я думаю, что мой быстрее, хотя он идет не в том направлении, в котором вы ожидали.
P.S. Я не был уверен, действительно ли вы имели в виду субботу R-S; Воскресенье: TZ - ваш пример кода и вопрос противоречат друг другу.
Вам не хватает двух моментов:
i, чтобы представить индексbreak, чтобы выйти из цикла for во время проверкиlower(), чтобы преобразовать name[0]tuple_letter = (['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'], ['m'], ['n', 'o', 'p', 'q'], ['r', 's', 't'], ['u', 'v', 'w', 'x', 'y', 'z'])
tuple_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
name = input("Name: \n")
i = 0
for letters in tuple_letter:
if letters.count(name[0].lower()) >= 1:
print(name + ", you should go to the hospital on " + tuple_week[i])
break
i += 1
Вы имеете в виду, что если я введу «Кара», печатное утверждение должно быть «Кара, вы должны пойти в больницу в среду»?