Как работает == сравнение двух словарей, когда значение является изменяемым типом, подобным списку (порядок имеет значение)? - PullRequest
0 голосов
/ 05 февраля 2020

Когда мы используем оператор == в двух словарях, он проверяет, что каждый словарь имеет одинаковый ключ / значения независимо от порядка, поскольку dict по своей природе неупорядочен

Однако для значения внутри dict если это изменчивый тип - пример: список, то как == работает с точки зрения порядка элементов в значении списка?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2020

Да, порядок имеет значение для заказанных типов. Дело не в том, чтобы быть изменчивым или неизменным. Dict и set являются изменяемыми и концептуально неупорядоченными (даже если dict сохраняет порядок вставки).

Список (и кортеж) упорядочены, поэтому два списка равны, они имеют одинаковые элементы в том же порядке.

Если у вас есть упорядоченный тип (например, список) в качестве значения в dict, то элементы dict могут быть в любом порядке, но элементы внутри самого списка должны быть в одном и том же порядке, чтобы два дикта считались равными.

Например,

{'A':[1,2], 'B':[3,4]} == {'B':[3,4], 'A':[1,2]}

Концептуально неупорядоченные суждения, и эти два диктанта описывают одно и то же содержание (в другом порядке).

Однако:

{'A':[1,2]} != {'A':[2,1]}

Списки упорядочены, поэтому два списка в словарях не равны; поэтому словари не равны.

0 голосов
/ 05 февраля 2020

Вы путаете изменчивость с заказанным или нет. Наборы являются изменяемыми, но неупорядоченными (порядок не имеет значения).

Ответ на этот вопрос не имеет ничего общего с dict реализацией __eq__ (которую == вызывает), поскольку он делегирован Реализация типов значений __eq__.

Проще говоря, если v1 == v2, то {'a': v1} == {'a': v2}.

[1, 2] != [2, 1], поэтому {'a': [1, 2]} != {'a': [2, 1}.

Аналогично, {1, 2} == {2, 1} так {'a': {1, 2} == {'a': {2, 1}}.

Я не проверял C реализацию dict.__eq__, но это, вероятно, эквивалентно (возможно, с некоторыми более причудливыми оптимизациями):

if len(d1) != len(d2):
    # dicts don't have same # of keys, can't be equal
    return False

for k1, v1 in d1.items():
    try:
        v2 = d2[k1]
    except KeyError:
        # d2 does not have a key that d1 has, can't be equal
        return False       

    # delegating the check to the value's type implementation of ==    
    if v1 != v2:
         # d1 and d2 have the same key but the value is different, can't be equal           
        return False      

# all keys and values in d1 and d2 are equal, so dicts are equal    
return True               
0 голосов
/ 05 февраля 2020

, поскольку dict по своей природе неупорядочен

Обратите внимание, что они не начиная с 3.7 (они упорядочены по вставке, как списки).

как == работать с точки зрения порядка элементов в значении списка?

Вы сравниваете элемент за элементом в заданном порядке. Если что-то отличается, то оно отличается.

, если значение является изменяемым типом

Быть изменяемым или нет, не имеет значения, то же самое относится и к кортежу. список.

...