Не получается вывести два варианта ответа при создании проверки через len в словаре
favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': 'c',
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
for name, languages in favorite_languages.items():
if len(languages) >= 2 in favorite_languages:
print(f"\n{name.title()}'s favorite language's are:")
for language in languages:
print(language)
else:
print(f"\n{name.title()}'s favorite language are:")
for language in languages:
print(language)
Но команда if пропускается. Если запросить длину значений словаря через print, напечатается 2, 1, 2, 2.
Ответы (2 шт):
Проблема в том, что 'sarah': 'c', то есть 'c' - это строка, а не список.
print(len("abc")) # 3
print(len("a")) # 1
print(len(["a", "b"])) # 2
Кроме того, в вашем коде if len(languages) >= 2 in favorite_languages проверяется наличие элемента в словаре, то есть в данном примере len(languages) >= 2 будет либо True либо False, после чего произойдет проверка наличия этого True либо False в качестве ключа в favorite_languages (оператор in).
Либо мы корректируем
favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': ['c'],
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
либо
favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': 'c',
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
for name, languages in favorite_languages.items():
is_list = isinstance(languages, list)
count = len(languages) if is_list else 1
message = "languages are" if count >= 2 else "language is"
print(f"\n{name.title()}'s favorite {message}:")
if is_list:
for language in languages:
print(f"- {language.title()}")
else:
print(f"- {languages.title()}")
Этот фрагмент печатает True:
favorite_languages = {2: None}
languages = ['a', 'b']
print(len(languages) >= 2 in favorite_languages)
Потому что интерпретатор выражение
len(languages) >= 2 in favorite_languages преобразует в
(len(languages) >= 2) and (2 in favorite_languages).
Этот приём удобен для написания двойных (или больше) неравенств: a < x < b считается как принято а математике: (a < x) and (x < b). Во всех остальных случаях синтаксис вводит в заблуждение.
Я думаю что весь кусок in favorite_languages лишний. Если его убрать, if начнёт работать правильно.
Остальные мелочи:
Запись в словаре для Сары нарушает принятый формат данных: ключ – имя, значение – список строк. Случайно эти данные обрабатываются правильно, но если бы Сара предпочитала Паскаль, печать была бы странной. Должно быть так: 'sarah': ['c'],.
Два пробела перед language.
Множественное число пишется без апострофа: languages are.
Единственное число согласуется с другой формой глагола: language is.
Двоеточие после is/are обычно не нужно.
Я бы вообще собрал бы языки в одно перечисление через запятую.
favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': ['c'],
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
for name, languages in favorite_languages.items():
to_be = 's are' if len(languages) >= 2 else ' is'
print(f"{name.title()}'s favorite language{to_be} {', '.join(languages)}.")
Jen's favorite languages are python, ruby. Sarah's favorite language is c. Edward's favorite languages are ruby, go. Phil's favorite languages are python, haskell.