В отладке вы сделали pairs = zip(users, spends), затем debug = list(pairs). После этого d = dict(pairs) оказался пустым словарём. Почему?

Adict() не принимает результат zip() без явного приведения к списку пар.
Bzip() сортирует данные по первому аргументу и удаляет одинаковые ключи.
CНужно было писать pairs = zip(spends, users), иначе ключи и значения меняются местами.
Dzip() возвращает одноразовый итератор, и list(pairs) уже исчерпало его до конца.
Правильный ответ. zip() возвращает одноразовый итератор: после первого полного обхода он становится пустым.

Разбор

После pairs = zip(users, spends) объект pairs — это итератор, который выдаёт пары один раз. debug = list(pairs) уже прошёл его до конца, поэтому следующий dict(pairs) ничего не получает и возвращает пустой словарь. Чтобы такого не было, либо сразу собирают пары в список и переиспользуют его, либо создают новый zip(...) перед dict(...). zip ничего не сортирует и не отбрасывает; порядок аргументов меняет лишь, что станет ключом, а что значением, но не объясняет пустоту словаря.

Проверь себя · 1/3разбор после ответа
Что произойдёт при выполнении it = iter([]) и затем next(it)?
Тренировать Python в Telegram

Ещё вопросы по теме «Итераторы и генераторы»