Как работает магический метод __hаsh__ в питоне при создании словаря?
Имхо навряд ли это с ним связано потому что при списке всё ок. Со словарём может быть проблема если последующий ключ равен предыдущему, тогда он его перезаписывает.
[(user.email,user.name) for user in (jane, joe)]
Out[26]: [('jdoe@example.com', 'Jane Doe'), ('jdoe@example.com', 'Joe Doe')]
[(user,user.name) for user in (jane, joe)]
Out[33]: 
[(<__main__.User at 0x1614587a390>, 'Jane Doe'),
 (<__main__.User at 0x1614587a1d0>, 'Joe Doe')]
UPD
но
{joe:joe.name, jane:jane.name}
Out[46]: {<__main__.User at 0x1614587a1d0>: 'Jane Doe'}
Метод __hash__ определяет, какую часть объекта передать функции hash(), через которую вычисляется хеш, который используется в качестве ключа словаря:

print(hash("jdoe@example.com") == hash(jane))
True

В данном случае в качестве ключа словаря выступает hash от email, они одинаковые у jane/joe, поэтому в словарь попадает только один объект (последний добавленный). 

Если поставить
   def __hash__(self):
      return hash(self.name)
то оба будут в словаре.