python - 比较 Python 字典的方法与某些值类型失败?

标签 python dictionary set

我想不通。我有两本完全相同的词典。我使用标准方法来确定差异,应该没有差异。但是某些值类型总是作为差异返回,即使它们不是。例如,如果一个值是 pymongo.bson.ObjectId,则该方法无法将其评估为相同。

d1 = {'Name':'foo','ref1':ObjectId('502e232ca7919d27990001e4')}

d2 = {'Name':'foo','ref1':ObjectId('502e232ca7919d27990001e4')}

d1 == d2

返回:

True

但是:

set((k,d1[k]) for k in set(d1) & set(d2) if d1[k] != d2[k])

返回:

set([('ref1',Objectid('502e232ca7919d27990001e4'))])

所以我发现这很奇怪,不是吗?

d1['ref1'] == d2['ref1']  # True

d1['ref1'] != d2['ref1']  # False

什么????!?!??!?

最佳答案

ObjectId('502e232ca7919d27990001e4') 创建一个新对象,默认情况下 != 比较引用。尝试例如:

class Obj:
    def __init__(self, value):
        self.value = value

print Obj(1234) == Obj(1234) # False

这将评估为 false,因为它们是不同的实例,即使它们具有相同的值。为使其工作,该类必须实现 eq 方法:

class Obj:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

print Obj(1234) == Obj(1234) # True

要解决这个问题,您可以对类进行“猴子修补”:

class Obj:
    def __init__(self, value):
        self.value = value

print Obj(1234) == Obj(1234) # False

Obj.__eq__ = lambda a, b: a.value == b.value

print Obj(1234) == Obj(1234) # True

或者直接通过值比较。

print Obj(1234).value == Obj(1234).value

尽可能比较值,因为猴子修补可能会破坏看似无关的代码。

关于python - 比较 Python 字典的方法与某些值类型失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465562/

相关文章:

python - 遍历一组字典 - python - 基本搜索

optimization - 什么是快速查找集合列表的非空交集的数据结构?

java - 是否有不允许空值的基本 Java Set 实现?

algorithm - 在 3D 中搜索点之间的 K 个最小距离

Python:重命名父类(super class)的方法及其函数范围引用

python - 如何绘制多年来许多国家人口密度的 3d 散点图?

python - 当我尝试使用 pymysql 插入大 blob 时管道损坏

python - 如何在多目录项目中正确导入 python 模块?

C++11 基于范围的和映射 : readability

python - 如何简化这些字典理解?