2016-06-27 2 views
0

Лучше всего показать на примере. Я беру поле свойств из графика matplotlib. Это словарь с разными ключами и значениями.Сравните два словаря с различными типами данных как значения

keys = gca().properties().keys 
ax1 = gca().properties() 

Тогда я черчения что-то другое, и я беру еще один экземпляр

ax2 = gca().properties() 

Теперь предполагая, что одни и те же ключи действительны для ax2 (я думаю, что они, так как я не изменил тип сюжета), как я могу сравнить каждый из значений ax1 и ax2? Эти значения представляют собой разные типы данных, и простое сравнение не работает. Я попытался

for key in keys: 
    if ax1[key]!=ax2[key]: 
     print(key,ax1[key]) 

На что я получаю

Traceback (most recent call last): 

    File "<ipython-input-46-363fb313494e>", line 2, in <module> 
    if ax1[key]!=ax2[key]: 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

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

ответ

0

Кажется, что существует встроенная функция deepdiff, которая принимает два объекта и переходит во все их дочерние методы, чтобы найти различия. Создайте свою собственную функцию.

1

Проблема заключается в том, что numpy массивы не поддерживают преобразования в bool, поэтому проблема не != сравнение, но тот факт, что if оператор пытается преобразовать obejct в bool, чтобы увидеть, является ли это True или False и этот шаг терпит неудачу.

Хитрость заключается в том, чтобы проверить, действительно ли значение является ndarray и если так использовать .all() или .any() для преобразования результата в сравнении с bool:

# assuming: import numpy as np 
for key in keys: 
    val1, val2 = ax1[key], ax2[key] 
    are_different = val1 != val2 
    if isinstance(val1, np.ndarray): 
     are_different = are_different.any() 

    if are_different: 
     print(key,ax1[key]) 

Использование .any() означает, что если одна запись в эти массивы отличаются, тогда они считаются разными. Замените его на .all(), если вы хотите, чтобы все записи были разными.

+0

Ответ действителен, но после проверки я понял, что свойства сюжета вложены очень глубоко. Например, цвет линии находится в 'gca(). Properties() ['lines'] [0] .get_color()'. Есть ли способ сравнить цвета строк двух графиков (ax1 и ax2) без явного указания свойства? Я хочу сравнить все свойства и найти только те, которые отличаются. – Aguy

+0

@ Theguy Да, но если в этих типах данных правильно реализовано сравнение равенства, приведенный выше код должен сравнивать 'gca(). Properties() ['lines'] [0]', и сравнение вернет 'False'. Если равенство не выполняется должным образом, оно почти всегда будет возвращать 'False'. В любом случае, если он не работает или вам требуется более подробное сравнение, вам нужно добавить более специальные случаи и вручную пойти глубже ... нет встроенного «сделать diff из двух общих объектов» в python. – Bakuriu

Смежные вопросы