如何使用列表理解比较两个字典的值?

mig*_*ton 1 python dictionary dictview

如何仅比较两个字典的值?

所以我有这个:

dict1 = {"appe": 3962.00, "waspeen": 3304.08}
dic2 = {"appel": 3962.00, "waspeen": 3304.08}


def compare_value_dict(dic):
    return dic

def compare_value_dict2(dic2):   
    return dic2
    

def compare_dic(dic1, dic2):
    if dic1 == dic2:       
        print('the same dictionary')
    else:      
        print('difference dictionary')

compare_dic(compare_value_dict(dict1).values(), compare_value_dict2(dic2.values()))

Run Code Online (Sandbox Code Playgroud)

这有效:

compare_dic(compare_value_dict(dict1).keys(), compare_value_dict2(dic2.keys()))
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

您不能==dict.values()字典视图对象上使用,因为该特定类型的行为不像集合。相反,values_view_foo == values_view_bar仅当两者都引用相同的字典视图对象时才为真。内容并不重要。

\n

这完全取决于字典包含的值的类型以及此处可以使用的技术。以下选项将涵盖许多不同类型的值,但不是全部。为字典中所有可能的值类型创建一个通用的万能比较函数实际上是不可能的。

\n

在这种特定情况下,您可以将值视图转换为集合,因为这些值恰好是唯一可散列的

\n
def compare_dict_values(dv1, dv2):\n    """Compare two dictionary values views\n\n    Values are assumed to be unique and hashable\n\n    """\n    return set(dv1) == set(dv2)\n
Run Code Online (Sandbox Code Playgroud)\n

如果值不唯一和/或不可散列,则您必须找到另一种方法来比较这些值。

\n

例如,如果它们是可排序的(可排序的),那么您可以通过首先对值进行排序来比较它们:

\n
def compare_dict_values(dv1, dv2):\n    """Compare two dictionary values views\n\n    Values are assumed to be unique and hashable\n\n    """\n    return set(dv1) == set(dv2)\n
Run Code Online (Sandbox Code Playgroud)\n

通过排序,您可以消除值视图无序的问题。检查len()之所以存在,是因为它比排序便宜得多,因此让\xe2\x80\x99s 在不需要时避免排序。

\n

如果值是可散列的但不是唯一的(因此值集合(\'foo\', \'bar\', \'foo\')与 不同(\'foo\', \'bar\', \'bar\')),您可以使用Counter()对象来捕获值及其计数:

\n
from collections import Counter\n\ndef compare_dict_values(dv1, dv2):\n    """Compare two dictionary value views\n\n    Values are assumed to be hashable, but do not need to be unique.\n\n    """\n    return Counter(dv1) == Counter(dv2)\n
Run Code Online (Sandbox Code Playgroud)\n

注意:这些技术都假设字典中的各个值支持相等测试,并且您只需要它们完全相等。对于浮点值,您可能会遇到值几乎相等但不完全相等的问题。如果您的值需要接近而不仅仅是完全相等,则可以对每对值使用该math.isclose()函数。用于zip(sorted(dv1), sorted(dv2))配对值:

\n
def compare_dict_values(dv1, dv2):\n    """Compare two dictionary value views\n\n    Values are assumed to be orderable, but do not need to be unique\n    or hashable.\n\n    """\n    return len(dv1) == len(dv2) and sorted(dv1) == sorted(dv2)\n
Run Code Online (Sandbox Code Playgroud)\n

如果你的值可以是不同的类型,事情就会变得更加复杂;您通常无法对混合有不同类型的字典值视图进行排序。如果您有多种类型,其中并非所有类型都是可哈希的,则必须首先分离出不同的类型,然后使用混合技术来比较相同类型的值。当您有一个类型层次结构(其中子类可以与超类进行比较等)时,这会变得复杂。我声明这超出了本答案的范围。

\n

  • @chrslg:我知道浮动是如何工作的。您可以使用语法创建一个实际上并不完全等于实际值的浮点值,这远远超出了这个问题的范围。问题的实质是比较字典值,我已经非常清楚地记录了您可以这样做的限制。我在这里给出**一般性答案**,以使其对尽可能广泛的受众有用。老实说,将其与浮点值的特性混为一谈并没有帮助。 (2认同)