gpt4 book ai didi

python - Python 中字典的严格比较

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:28 25 4
gpt4 key购买 nike

我在比较两本相似的词典时遇到了一些麻烦。我想要对值(可能还有键)进行更严格的比较。

这是最基本的问题:

>>> {'a': True} == {'a': 1}
True

类似地(有点令人困惑):

>>> {1: 'a'} == {True: 'a'}
True

这是有道理的,因为 True == 1。我正在寻找的是行为更像 is 的东西,但比较两个可能嵌套的字典。显然,您不能对两个词典使用 is,因为这将始终返回 False,即使所有元素都相同也是如此。

我目前的解决方案是只使用 json.dumps 来获取两者的字符串表示形式并进行比较。

>>> json.dumps({'a': True}, sort_keys=True) == json.dumps({'a': 1}, sort_keys=True)
False

但这只有在一切都是 JSON 序列化的情况下才有效。

我还尝试手动比较所有键和值:

>>> l = {'a': True}
>>> r = {'a': 1}
>>> r.keys() == l.keys() and all(l[key] is r[key] for key in l.keys())
False

但是如果字典有一些嵌套结构,这会失败。我想我可以写一个递归版本来处理嵌套的情况,但它看起来不必要地丑陋和非 pythonic。

是否有“标准”或简单的方法来做到这一点?

谢谢!

最佳答案

您与 JSON 非常接近:改用 Python 的 pprint 模块。这被记录为在 Python 中对字典进行排序 2.5+3 :

Dictionaries are sorted by key before the display is computed.

让我们确认一下。这是 Python 3.6 中的一个 session (即使对于常规 dict 对象也可以方便地保留插入顺序):

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = {2: 'two', 3: 'three', 1: 'one'}
>>> b = {3: 'three', 2: 'two', 1: 'one'}
>>> a
{2: 'two', 3: 'three', 1: 'one'}
>>> b
{3: 'three', 2: 'two', 1: 'one'}
>>> a == b
True
>>> c = {2: 'two', True: 'one', 3: 'three'}
>>> c
{2: 'two', True: 'one', 3: 'three'}
>>> a == b == c
True
>>> from pprint import pformat
>>> pformat(a)
"{1: 'one', 2: 'two', 3: 'three'}"
>>> pformat(b)
"{1: 'one', 2: 'two', 3: 'three'}"
>>> pformat(c)
"{True: 'one', 2: 'two', 3: 'three'}"
>>> pformat(a) == pformat(b)
True
>>> pformat(a) == pformat(c)
False
>>>

让我们快速确认 pretty-print 对嵌套字典进行排序:

>>> a['b'] = b
>>> a
{2: 'two', 3: 'three', 1: 'one', 'b': {3: 'three', 2: 'two', 1: 'one'}}
>>> pformat(a)
"{1: 'one', 2: 'two', 3: 'three', 'b': {1: 'one', 2: 'two', 3: 'three'}}"
>>>

因此,不要序列化为 JSON,而是使用 pprint.pformat() 进行序列化。我想可能会有一些极端情况,您认为不相等的两个对象却创建了相同的漂亮打印表示。但这些情况应该很少见,你想要一些简单的 Pythonic,这就是。

关于python - Python 中字典的严格比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com