将向量的等式作为字典进行比较

时间:2015-02-25 04:59:24

标签: python

所以我有一个问题要解决(概述如下)。这个问题使用了一个有两个成员变量的类(Vec)。 v.D是指向量域中的元素,而v.f是指映射域元素的字典。

例如,如果v = Vec({'x','y','z'},{'y':1,'x':2})则vD = {'x','y' ,'z'}和vf = {'y':1,x:'2'}。如果v.D的元素没有出现在v.f中,则假定域的元素被映射为零(即'z':0出现在v.D中,但仅假设为v.f)。

问题建议我使用all()属性,但我似乎无法使其工作。我在下面包含两个解决方案(两个都不起作用)。我遇到的主要问题是当v.D的元素没有出现在v.f

中时,测试是否相等

`

def equal(u,v):

“””     如果u等于v(其中u和v是类vec()的成员),则返回true。     由于稀疏表示(域映射到零),仅比较字典

是不够的
>>> Vec({'a', 'b', 'c'}, {'a':0}) == Vec({'a', 'b', 'c'}, {'b':0})
True

Be sure that equal(u, v) check equalities for all keys from u.f and v.f even if
some keys in u.f do not exist in v.f (or vice versa)

>>> Vec({'x','y','z'},{'y':1,'x':2}) == Vec({'x','y','z'},{'y':1,'z':0})
False
>>> Vec({'a','b','c'}, {'a':0,'c':1}) == Vec({'a','b','c'}, {'a':0,'c':1,'b':4})
False
>>> Vec({'a','b','c'}, {'a':0,'c':1,'b':4}) == Vec({'a','b','c'}, {'a':0,'c':1})
False

The keys matter:
>>> Vec({'a','b'},{'a':1}) == Vec({'a','b'},{'b':1})
False

The values matter:
>>> Vec({'a','b'},{'a':1}) == Vec({'a','b'},{'a':2})
False

"""


assert u.D == v.D

for k in v.D:
    if k in v.f and k in u.f:
        return v.f[k] == u.f[k]

all(v.f [i] == u.f [i] for i in v.D)

1 个答案:

答案 0 :(得分:4)

我会这样做:

def equal(u, v):
   if u.D != v.D: return False  # domains must be equal
   return all(u.f.get(x, 0) == v.f.get(x, 0) for x in u.D)

这个明显的解决方案有什么问题吗?