【问题标题】:Compare two dictionaries with various data types as values比较具有各种数据类型的两个字典作为值
【发布时间】:2016-07-08 23:39:40
【问题描述】:

最好举个例子。我正在从 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()

我实际上想找到两个图之间不同的字段的名称和值。有没有办法处理如此复杂的数据结构?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    问题是numpy数组不支持转换为bool, 所以问题不在于!= 比较,而是if 语句试图将对象转换为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()

    【讨论】:

    • 答案是有效的,但在尝试之后我意识到情节属性嵌套得很深。例如,线条颜色为gca().properties()['lines'][0].get_color()。有没有办法在不明确命名属性的情况下比较两个图(ax1 和 ax2)的线条颜色?我想比较所有属性,只找到不同的。
    • @Theguy 是的,但是如果在这些数据类型中正确实现了相等比较,则上面的代码应该比较gca().properties()['lines'][0],比较将返回False。如果没有正确实现相等,它几乎总是会返回False。在任何情况下,如果它不起作用或者如果您想要更详细的比较,您必须添加更多特殊情况并手动更深入......python中没有内置的“使两个通用对象的差异”。
    【解决方案2】:

    似乎知道内置的deepdiff 函数接受两个对象并进入它们的所有子方法以查找差异。构建自己的函数。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2011-11-04
      • 2016-10-22
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多