用相同的键排序的Python字典

Taj*_*ton 2 python floating-point dictionary hashmap

我认为这肯定已经得到了解答,但我在谷歌或这里找不到任何东西.

我知道,一般来说,你不能依赖Python字典的排序.但是,如果您有两个具有相同键的字典,您是否可以依赖于相同顺序的值?

我问,因为我试图比较浮点数的两个字典,所以我不能使用dict1==dict2.我的函数看起来像这样:

def _compare_dict(self, d1, d2):
    """
    Compares two dictionaries of floating point numbers
    for equality.
    """
    if d1.keys() != d2.keys():
        return False

    zipped = zip(d1.itervalues(), d2.itervalues())
    return len(filter(lambda x: abs(x[0] - x[1]) > sys.float_info.epsilon, zipped)) == 0
Run Code Online (Sandbox Code Playgroud)

这是一场危险的比赛吗?在一次测试中,订单似乎成立:

In [126]: d1={'a': 3, 'b': 2, 'c': 10}
In [127]: d2={'b': 10, 'c': 7, 'a': 2}

In [128]: d1
Out[128]: {'a': 3, 'b': 2, 'c': 10}

In [129]: d2
Out[129]: {'a': 2, 'b': 10, 'c': 7}
Run Code Online (Sandbox Code Playgroud)

但我不知道这是否值得我依靠.当然,其他用于比较两个浮点数字典的解决方案也是受欢迎的.

JBe*_*rdo 8

根据字典的构建方式,您不能依赖它.

一些例子:

>>> a = dict.fromkeys(range(1000))
>>> b = dict.fromkeys(range(500,600))
>>> for i in range(500):
    del a[i]

>>> for i in range(600,1000):
    del a[i]

>>> all(i==j for i,j in zip(a,b))
False
>>> a == b
True
Run Code Online (Sandbox Code Playgroud)

a是一个更大的哈希表,因为它已经为1000个对象分配了空间,而b只能容纳大约100个而不会增长一点.因此存储哈希的方式可以改变迭代顺序