Подскажите, пожалуйста, почему код не является верным? (Яндекс практикум. Введение Python, урок 6, тема словари )
Задание: Напечатайте о каждом из друзей такое сообщение
<имя_друга>живёт в городе<название_города>
Хочу понять имеет ли мой вариант на жизнь? (даже если он более громоздкий)
P.S. Скобки в print менял на круглые - не изменилось ничего
Буду очень благодарен!
friends = {
'Серёга': 'Омск',
'Соня': 'Москва',
'Дима': 'Челябинск',
'Айгуль': 'Казань',
'Алёна': 'Белгород',
'Даниил': 'Санкт-Петербург',
'Лев': 'Тула',
'Валера': 'Сыктывкар',
'Антон': 'Ялта',
'Карен': 'Краснодар'
}
a = len(friends.values())
for i in range(0,a-1)
print(friends.keys[i],"живёт в городе",friends.value[i])
Ошибка:
Traceback (most recent call last):
File "main.py", line 15, in <module>
print(friends.keys[i],"живёт в городе",friends.value[i])
TypeError: 'builtin_function_or_method' object is not subscriptable
Ответы (1 шт):
Сначала о том, почему не работает.
Интерпретатор вам сообщает: builtin_function_or_method' object is not subscriptable
Это значит, что вы пытаетесь применить обращение по индексу [i] к методу. А методы (keys и values) надо вызывать. Попробуем починить:
print(friends.keys()[i], "живёт в городе", friends.values()[i])
Теперь ошибка другая:
'dict_keys' object is not subscriptable
К результату вызова функции keys() тоже нельзя применить квадратные скобки. Почему? Если мы пороемся в документации по стандартной библиотеке Python, то обнаружим, что методы keys() и values() возвращают некий view, который в свою очередь является неупорядоченным множеством (set).
Keys views are set-like since their entries are unique and hashable.
Поэтому и обратиться к его элементам по индексу нельзя.
Что же делать? Довольно идиоматичным способом для Python будет перебор элементов словаря сразу в виде пар (tuple). А вывод аккуратнее будет отформатировать через f-строки.
for name, city in friends.items():
print(f"{name} живет в городе {city}")