Подскажите, пожалуйста, почему код не является верным? (Яндекс практикум. Введение Python, урок 6, тема словари )

Рейтинг: 2Ответов: 1Опубликовано: 15.04.2023

Задание: Напечатайте о каждом из друзей такое сообщение

<имя_друга> живёт в городе <название_города>

Хочу понять имеет ли мой вариант на жизнь? (даже если он более громоздкий) 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}")