Не получается вывести два варианта ответа при создании проверки через 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 шт):

Автор решения: Evgenii Evstafev

Проблема в том, что '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()}")
→ Ссылка
Автор решения: Stanislav Volodarskiy

Этот фрагмент печатает 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.
→ Ссылка