Почему сравнение идентичных значений dict в python 3.5.2 возвращает False? - PullRequest
0 голосов
/ 07 декабря 2018

Чтобы использовать пример, вам нужно создать следующий json-файл (test.json):

{
  "/apps/media/efel_data/efel_gui/results/305933/20180515094131/u_res": {
    "step_700.0": {
      "stimuli": [
        {"delay": 620.0, "amp": 700.0, "duration": 1000.0, "totduration": 1300.0},
        {"delay": 0.0, "amp": 0.0, "duration": 1300.0, "totduration": 1300.0}
      ]
    }
  }
}

и создать zip-файл, содержащий этот единственный файл (только для демонстрационных целей)

ls | zip -@ files.zip

Предположим, что оба файла находятся в папке temp, запустите следующий код:

import zipfile
import json

z = zipfile.ZipFile("temp/files.zip")
with z.open('test.json') as f:
     data = json.loads(f.read().decode('utf-8'))
with open('temp/test.json') as f:
    expected = json.loads(f.read())
print(data.values())
print(expected.values())
print(data.values()==expected.values())

Теперь мне нужно сравнить значения из dict (какпервый ключ может отличаться в реальном использовании кода).Однако выходные данные кода (python 3.5.2) указывают, что идентичные значения не идентичны:

dict_values([{'step_700.0': {'stimuli': [{'totduration': 1300.0, 'amp': 700.0, 'delay': 620.0, 'duration': 1000.0}, {'totduration': 1300.0, 'amp': 0.0, 'delay': 0.0, 'duration': 1300.0}]}}])
dict_values([{'step_700.0': {'stimuli': [{'totduration': 1300.0, 'amp': 700.0, 'delay': 620.0, 'duration': 1000.0}, {'totduration': 1300.0, 'amp': 0.0, 'delay': 0.0, 'duration': 1300.0}]}}])
False

Любое объяснение, что происходит, и как я могу решить эту проблему?

1 Ответ

0 голосов
/ 07 декабря 2018

Видимо, ваши 2 дикта идентичны.Это может быть подтверждено, если вы конвертируете dict.values() в list(), например:

print(list(data.values()) == list(expected.values()))

True

Я думаю, что проблема в том, как Python сравнивает dict.values().Самое смешное, что даже items() работает правильно:

print(data.items() == expected.items())

True

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

...