跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 为什么两个字典对比,结果和想象的不同?
未分類
26 6 月 2020

为什么两个字典对比,结果和想象的不同?

为什么两个字典对比,结果和想象的不同?

資深大佬 : qazwsxkevin 5

*** import decimal from sqlalchemy import Integer,Numeric,String,INTEGER,DateTime,DECIMAL,null ***  if __name__ == '__main__':        a = {'时间': datetime.datetime(2020, 5, 10, 11, 19), '力量': DECIMAL('26.77'), '量值': 90, '变化': None, '属性': None,          '对方力量': DECIMAL('31.75'), 'TOP': 2291, '最低力量': DECIMAL('1.89'), '最高力量': 2022, 'roundid': '899',          '序号': 1}     b = {'时间': datetime.datetime(2020, 5, 10, 11, 25), '力量': DECIMAL('26.77'), '量值': 90, '变化': None, '属性': None,          '对方力量': DECIMAL('31.75'), 'TOP': 2291, '最低力量': DECIMAL('1.89'), '最高力量': 2022, 'roundid': '899',          '序号': 2}      a.pop('序号')     a.pop('时间')      b.pop('序号')     b.pop('时间')       if a == b:         print('相同')     else:         print('不同')      # 这里对比结果是 False,为什么不同?   怀疑是 DECIMAL 的问题?我继续做了下面的测试      a = decimal.Decimal('1.77')     b = decimal.Decimal('1.77')      if a == b:         print('yes')     else:         print('no')      if a == b:         print('True')     else:         print('False')       # 这里是 True....       a = DECIMAL('1.77')     b = DECIMAL('1.77')      if a == b:         print('yes')     else:         print('no')      # 这里是 False  
a 和 b,其实是在一个列表里,包含 N 个字典,历遍获取,是准备通过 sqlalchemy 写入到 mysql, a 和 b,pop 了序号和时间两个元素后,内容肯定是一样的, 请教各位高手,a.b 对比出了什么问题? 

大佬有話說 (9)

  • 資深大佬 : wuwukai007

    def __eq__(self,obj):
    >>>>if self.precision == obj.precision:
    >>>>>>>>return True
    >>>>else:
    >>>>>>>>return False
    DECIMAL.__eq__ = __eq__
    a == b = True

  • 資深大佬 : lithbitren

    字典里用内置库的 decimal.Decimal 比是相同的,再排查下是不是 sqlalchemy 模块的问题

  • 主 資深大佬 : qazwsxkevin

    先谢谢两位,依然不是明白原因,想了一晚,看样子像是要把 a,b 两个字典里面,是 DECIMAL 类型的元素,转成 deciaml.Decimal 后,再去做比较,字典数量不少,有些担心效率严重慢了…

  • 資深大佬 : xuanbg

    ab = decimal.Decimal(‘1.77’)时,a 和 b 比的是值。
    ab = DECIMAL(‘1.77’)时,a 和 b 比的是对象,ab 是字典的时候比的也是对象。两个不同的对象当然不相等了。

  • 資深大佬 : toaruScar

    你看过 sqlalchemy.DECIMAL 的文档了吗?
    DECIMAL 是用来表示数据类型的,你是不是看着名字差不多就打算大力出奇迹了?
    是不是还打算用 sqlalchemy.String 来存 str ?

  • 資深大佬 : iceking

    >>> class foo():
    … pass
    …
    >>> a = foo()
    >>> b = foo()
    >>> a == b
    False

    object 的 __eq__ 方法比较的两个对象的 id 。可以通过自己实现 __eq__ 来比较值。

  • 資深大佬 : iceking

    @xuanbg 字典比较的是值

  • 資深大佬 : SjwNo1

    你需要看 sqlalchemy.DECIMAL

  • 資深大佬 : SjwNo1

    或者你可以重写 __eq__
    DECIMAL 一般用来声明字段类型, 源码内部有一个 comparator_factory 可能对你有帮助

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具