невозможно распаковать неитерируемый объект int

Рейтинг: 0Ответов: 1Опубликовано: 14.07.2023
# Инизиализировать словарь пустым списком для идентификатора каждого пользователя
friendships = {user["id"]: [] for user in users}
# И перебрать все дружеские пары, заполняя их:
for i, j in friendships:
    friendships[i].append(j) # Добавить j как друга для i
    friendships[j].append(i) # Добавить i как друга для j

Выдает ошибку:

TypeError: cannot unpack non-iterable int object.

Не могу понять почему.

Ответы

▲ 3

Итерация по самому словарю - это итерация по его ключам. Проверьте сами:

sample = {'a':1, 'b':2, 'c':3}
for i in sample:
    print(i)

В выводе у нас будет:

a
b
c

В python также есть разложение:

x = [1, 2]
a, b = x

Соответственно, выполнение кода for i, j in friendships ожидает, что единицы итерации будут разложены на i и j.

Это сработало бы, если, например, ключами в нашем словаре были кортежи (tuple)*:

z = {(1,2):'привет', (3,4):'ромашки'}
for i,j in z:
    print(f"{i=}, {j=}")

Но в нашем словаре friendships ключи - int-ы. Итерация for i, j in friendships на практике пытается сделать: i, j = 1. Из-за чего и появляется TypeError: cannot unpack non-iterable int object.


Таким образом вам надо понять, как правильно пройтись по вашим данным, чтобы разложить их так, как вы хотите.

У встроенных словарей есть несколько методов, дающий легкий доступ к разным итерациям: по ключам - .keys(), по значениям - .values(), по парам ключ-значение - .items().

Обратитесь к документации, посмотрите методы встроенных типов данных (list, str, dict, tuple, set и др.) - это обогатит ваше понимание того, как вы можете управлять объектами и что вы можете с ними делать.


* ключами словаря могут быть любые хешируемые объекты.