У меня есть итератор с некоторыми объектами в нем, и я хотел создать коллекцию uniqueUsers, в которой я перечисляю только каждый пользователь один раз. Поэтому, играя немного, я попробовал это как с списком, так и с dict:
>>> for m in ms: print m.to_user # let first look what inside ms
...
Pete Kramer
Pete Kramer
Pete Kramer
>>>
>>> uniqueUsers = [] # Create an empty list
>>> for m in ms:
... if m.to_user not in uniqueUsers:
... uniqueUsers.append(m.to_user)
...
>>> uniqueUsers
[Pete Kramer] # This is what I would expect
>>>
>>> uniqueUsers = {} # Now let create a dict
>>> for m in ms:
... if m.to_user not in uniqueUsers:
... uniqueUsers[m.to_user] = 1
...
>>> uniqueUsers
{Pete Kramer: 1, Pete Kramer: 1, Pete Kramer: 1}
Итак, я тестировал его, преобразовывая dict в список при выполнении инструкции if, и это работает так, как я ожидал бы этого:
>>> uniqueUsers = {}
>>> for m in ms:
... if m.to_user not in list(uniqueUsers):
... uniqueUsers[m.to_user] = 1
...
>>> uniqueUsers
{Pete Kramer: 1}
и я получаю аналогичный результат путем тестирования с uniqueUsers.keys()
.
Дело в том, что я не понимаю, почему эта разница происходит. Я всегда думал, что если вы делаете if object in dict
, он просто создает список ключей dicts и снова проверяет это, но это явно не так.
Может ли кто-нибудь объяснить, как object in dict
работает внутри и почему он не ведет себя аналогично object in list
(как я ожидал бы этого)?